首先二分答案x。每行加上min(x, (x-1)/i),再统计x出现次数。复杂度为O(nlog(nm))。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long LL;
LL n, m, k;
int main(){
LL ans;
scanf("%I64d%I64d%I64d", &n, &m, &k);
LL l = 1, r = n * m;
LL mid;
while(l <= r){
mid = (l + r) >> 1;
LL c = 0;
LL sum = 0;
for(LL i = 1; i <= n; i++){
sum += min(m, (mid - 1) / i);
if(mid % i == 0 && mid / i <= m)c++;
}
if(sum < k && sum + c >= k){
ans = mid;
break;
}
if(sum + c < k)l = mid + 1;
else r = mid - 1;
}
printf("%I64d\n", ans);
return 0;
}