题意:在一个蛋糕上放n个蜡烛,摆成r个同心圆,中心可放可不放,对于第i个同心圆,放ki个蜡烛,问k*r最小时的k和r,如果k*r相同要求输出r小的。
解法:因为k最小是2,根据等比数列通项公式算出r不超过40,所以只要枚举r,二分求出对应的k,找到最小的k*r就可以了。
代码:看看以前的代码风格还真是丑……
#include<stdio.h> long long FIND(long long k,long long n) { long long l=2,r=n; long long m=(l+r)/2; while(l<=r) { m=(l+r)/2; long long tmp=1; long long sum=1; for(int i=0;i<k;i++) { if(m>n/sum) { tmp=n+2; break; } sum*=m; tmp+=sum; if(tmp>n+1) break; } if(tmp==n||(tmp-1)==n) return m; else if(tmp>n) r=m-1; else l=m+1; } return -1; } int main() { long long n,r,k; while(~scanf("%I64d",&n)) { r=1,k=n-1; long long minn=n-1; for(long long i=1; i<45; i++) { long long ans=FIND(i,n); if(ans!=-1&&i*ans<minn) { minn=i*ans; r=i; k=ans; } } printf("%I64d %I64d ",r,k); } }