如果直接进行搜索,时间复杂度是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 ", ans); } return 0; }