AcWing 4080. 第k个数(二分)
题意
给定一个 \(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;
}