如果直接进行搜索,时间复杂度是O(n*m),肯定会超时。利用在乘法表中,每一行的数字都是(1*m,2*m,3*m,……,n*m)(m是行号)这一特点对行进行二分,mid/m就是mid
在这行中的排名。通过对每行进行搜索,就可以知道mid在鼠标中的总排名。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long t, n, m;
bool judge(long long x) {
long long cnt = 0;
for (long long i = 1; i <= m; i++) {
//注意x/i 大于n的情况
cnt += min(x/i, n);
}
return cnt >= t;
}
int main() {
while (scanf("%lld%lld%lld", &n, &m, &t) != EOF) {
long long lb = 1, ub = m*n;
long long ans = 0;
while (ub - lb >= 0) {
long long mid = (lb + ub)>>1;
if (judge(mid)) {
ans = mid;
ub = mid - 1;
}
else {
lb = mid + 1;
}
}
printf("%lld\n", ans);
}
return 0;
}