[CF448D] Multiplication Table - 二分

[CF448D] Multiplication Table - 二分

Description

给出一个 \(f[i][j]=ij\),求其中第 k 小的数。\(n,m \le 5\times 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;
}
上一篇:Python 3基础教程16-类


下一篇:HDU1517 A Multiplication Game (博弈论+思维)