HDU 4430 Yukari's Birthday
题意:在一个蛋糕上放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\n",r,k);
}
}

浙公网安备 33010602011771号