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