Solution
可以设横向切了 (x) 次,则纵着切了 (k-x) 刀,为使最小值最大化,所以要切的均匀。那么 (ans=leftlfloordfrac n{x+1} ight floorcdotleftlfloordfrac m{k-x+1} ight floor(0leq xleq k)) 。
因为 (leftlfloordfrac n{i} ight floor) 最多有 (sqrt n) 种取值,所以枚举找最小值即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k;
ll solve(ll n,ll m,ll k){
ll ans=1;
for(int i=1,pre=0;i<=n;i=pre+1){
pre=n/(n/i);
if(pre>k+1){
ans=max(ans,n/(k+1)*m);
break;
}
ans=max(ans,(n/pre)*(m/(k-pre+2)));
}
return ans;
}
int main(){
while(~scanf("%lld%lld%lld",&n,&m,&k)){
if(k>n+m-2) puts("-1");
else printf("%lld
",solve(n,m,k));
}
return 0;
}