HDU 4430 Yukari's Birthday

来源:互联网 发布:第戎高等商学院 知乎 编辑:程序博客网 时间:2024/06/06 09:13

题意:将蛋糕分成r层,每层可以插k^i个蜡烛(r>=1,k>=2),一共有n个蜡烛,输出当r*k最小时的r和k

解题思路:二分+枚举.因为最多有10^12个蜡烛,所以枚举r的时候枚举到50就可以了,对枚举出的每一个r二分查找k,查找的时候要注意防止爆long long,最后不断更新求最小的r和k即可,注意不能将x设为INF会WA,可能是因为k^i,x不会超过n

代码:

#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cstdio>#include <cmath>using namespace std;#define INF 0x3f3f3f3ftypedef long long ll;ll n;ll search_(ll rr){    ll l=2,r=n;    while(l<=r)    {        ll mid=(l+r)/2;        ll sum=0,ans=1;        for(ll i=1; i<=rr; i++)        {            if(n/ans<mid){sum=n+1;break;}//防止爆long long             ans*=mid;            sum+=ans;            if(sum>n)break;        }        if(sum==n||sum==n-1)return mid;        else if(sum>n)r=mid-1;        else if(sum<n)l=mid+1;    }    return -1;}int main(){    while(cin>>n)    {        ll r,k,x=n;        for(ll i=1; i<50; i++)        {            ll y=search_(i);            if(y!=-1&&y*i<x)            {                r=i;                k=y;            }        }        cout<<r<<" "<<k<<endl;    }    return 0;}


原创粉丝点击