自己画图模拟一下,就会发现其实把每行的到mid小的数加起来是不是k,如果是k的话,那么直接就退出吗,如果不是的话继续二分搞起
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long int ll;
int main(){
ll l,r;
ll a,b;
ll m;
ll num;
ll k;
scanf("%I64d%I64d%I64d",&a,&b,&k);
l=1;
r=a*b;
while(l<r){
num=0;
m=(l+r)>>1;
for(ll i=1;i<=a;i++){
num+=min(m/i,b);
}
if(num<k) l=m+1;
else r=m;
}
printf("%I64d\n",r);
}