在1到n*m+1之间二分查找求出从小到大第k个数(这个题要注意不是第k大的数)
对于每个数x,乘法表第i行都有min((m-1)/i,m)个数比x小,累加后与k比较即可
#include<bits/stdc++.h>
using namespace std;
long long f(long long x,long long n,long long m)
{
long long sum=0;
for(long long i=1;i<=n;i++)
sum+=min(m,(x-1)/i);
return sum;
}
int main()
{
long long n,m,k;
scanf("%I64d%I64d%I64d",&n,&m,&k);
long long l=1,r=n*m+1;
while(l<r)
{
long long x=(l+r)/2;
if(f(x,n,m)<k)
l=x+1;
else
r=x;
}
printf("%I64d\n",l-1);
return 0;
}