【Codeforces 448D】Multiplication Table
阿新 • • 發佈:2020-12-04
題目連結
翻譯
給你一個 \(n*m\) 的乘法表,讓你找出其中第 \(k\) 小的數字。(重複的話算多次)
比如 \(2*2\) 的乘法表中,有 1,2,2,4
這 \(4\) 個數字,則第 \(3\) 小的數字是 \(3\),第 \(4\) 小的數字是 \(4\)。
題解
二分答案。
如果二分的 \(x\) 是最後的答案,那麼應該滿足整個乘法表中 嚴格 比它小的數字的個數小於等於 \(k-1\)。
找到最大的,滿足比它小的數字小於等於 \(k-1\) 的數字就可以了。
注意輸入的 \(k\) 可能是個 \(long long\) 型別的整數,別順手打成 int
了。
程式碼
#include <bits/stdc++.h> #define LL long long using namespace std; const int N = 100; int n, m; LL k; int a[N*N+10]; bool ok(LL x){ x--; LL cnt = 0; for (int i = 1;i <= n; i++){ cnt += min(1LL*m,x/i); } return cnt <= k-1; } int main(){ cin >> n >> m >> k; LL l = 1,r = 1LL*25*1e10,temp=1; while (l <= r){ LL mid = (l+r)/2; if (ok(mid)){ l = mid + 1; temp = mid; }else{ r = mid - 1; } } cout << temp << endl; return 0; }