题目大意:
在一个蛋糕上插n个蜡烛,为了美观,将蛋糕分成r个同心圆,从内至外,依次插K^i根蜡烛,圆心可插可不插,现在要求你所有的情况中K*R最小的那种。
解题思路:
二分早就有过接触,但是一直没有做过二分的题目(都快大三的人了,惭愧),所以一开始根本就不明白怎么二分,但是理解之后还是有种阔然开朗的感觉啊。。。。
#include<stdio.h>
#define LL __int64
LL n;
LL cal(int lin)
{
LL sum,temp,l,mid,r;
int i;
l=2;
r=n;
while(l<=r)
{
mid=(l+r)/2;
sum=0;temp=1;
for(i=1;i<=lin;i++)
{
if(n/temp<mid)
{
sum=n+1;
break;
}
temp*=mid;
sum+=temp;
if(sum>n)
break;
}
if(sum==n||sum==n-1)
return mid;
else if(sum<n)
l=mid+1;
else
r=mid-1;
}
return -1;
}
int main()
{
int i;
LL r,k,temp;
while(scanf("%I64d",&n)!=EOF)
{
r=1;k=n-1;
for(i=2;i<=60;i++)
{
temp=cal(i);
// printf("%I64d\n",temp);
if(temp>0&&temp*i<(r*k))
{
r=i;k=temp;
}
}
printf("%I64d %I64d\n",r,k);
}
return 0;
}