題意
給定一個 \(n \times m\) 的方格矩陣,每個方格內都有一個整數元素。
其中第 \(i\) 行第 \(j\) 列的方格中的元素為 \(i \times j\) (行和列都從 1 開始編 믁)
現在,需要你將這 \(n \times m\) 個整數按照非嚴格單調遞增的順序一一寫 出。
請問,你寫出的第 \(k\) 個整數是多少。
算法
二分
check函數實現<= mid的數是否有k個即可。
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
const int MOD = 1e9 + 7;
typedef long long LL;
LL n, m, k;
LL check(LL mid){
LL res = 0;
for(int i = 1; i <=n; i++){
res += min(m, mid / i);
}
return res >= k;
}
int main(){
scanf("%lld%lld", &n, &m);
scanf("%lld", &k);
LL l = 1, r = n * m;
while(l < r){
LL mid = (l + r)>>1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout<<r<<endl;
return 0;
}