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);
    }
}

  

posted @ 2015-08-05 11:57  露儿大人  阅读(143)  评论(0编辑  收藏  举报