[CF448D] Multiplication Table

[CF448D] Multiplication Table - 二分

Description

给出一个 (f[i][j]=ij),求其中第 k 小的数。(n,m le 5 imes 10^5)

Solution

显然我们可以 O(n) 求出小于等于某个数的数字有多少个

二分即可

具体地,二分一个 mid,我们可以计算处小于等于 mid 的个数 cnt,如果 cnt>=k 则表明 mid 可能大了,否则 mid 小了

#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main()
{
    ios::sync_with_stdio(false);
    int n, m, k;
    cin >> n >> m >> k;
    // k = n * m - k + 1;
    int l = 1, r = 1e12;
    while (l < r)
    {
        int mid = (l + r) / 2;
        int cnt = 0;
        for (int i = 1; i <= n; i++)
            cnt += min(m, mid / i);
        if (cnt >= k)
            r = mid;
        else
            l = mid + 1;
    }
    cout << l;
}
原文地址:https://www.cnblogs.com/mollnn/p/14413361.html