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;
}

posted @ 2021-12-01 22:55  pxlsdz  阅读(262)  评论(0编辑  收藏  举报