该函数f(i, j) = i*j沿x方向和y方向都是单调递增的,故考虑用二分求解,函数值都可以直接算出来,不用填表了。
下面提供两个版本的答案,都是可以的:
//AC
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
ll a, b, c;
ll calc(ll m){
ll cnt = 0;
ll j = b;
for(int i = 1; i <= a; i++){
while(i * j > m) j--;
cnt += j; //j对于i来说是不递增的
}
return cnt;
}
int main(){
cin>>a>>b>>c;
ll s = 1, e = a * b; //闭区间
while(s != e){
ll m = (s + e)>>1;
if(calc(m) < c) s = m + 1;
else e = m;
}
cout<<s<<endl;
return 0;
}
第二个版本:
//AC
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
ll a, b, c;
ll calc(ll m){
ll cnt = 0;
ll j = b;
for(int i = 1; i <= a; i++){
while(i * j >= m) j--;
cnt += j; //j对于i来说是不递增的
}
return cnt;
}
int main(){
while(cin>>a>>b>>c){
ll s = 1, e = a * b; //闭区间
while(s != e){
ll m = (s + e + 1)>>1;
if(calc(m) < c) s = m;
else e = m-1;
}
cout<<s<<endl;
}
return 0;
}