hdu4430

/*
分析:
    长春区赛的水题(2012),枚举+二分。
    网上有各种神牛的解释,菜鸟就不废话了,囧~~~


                                        2012-10-23
*/
















#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"math.h"
__int64 n;
__int64 Z(__int64 x,__int64 k)
{
    __int64 i;
    __int64 t;
    t=x;
    for(i=2;i<=k;i++)   x*=t;
    return x;
}
int main()
{
    __int64 i;
    __int64 r_ans,k_ans,cop;
    __int64 low,up,mid;
    __int64 t,temp;

    while(scanf("%I64d",&n)!=-1)
    {
		r_ans=1;
		k_ans=cop=n-1;
        for(i=2;i<=40;i++)
        {
            low=2;up=pow(n,1.0/i);                //想不明白,我对这个右边界做了更好的优化,结果WA,去掉那个优化用这个,AC。。。
			while(low<=up)
            {
                mid=(low+up)>>1;
                temp=Z(mid,i);
                temp--;
                temp*=mid;
                if(temp<n*(mid-1))	low=mid+1;
                else				up=mid-1;
            }
			temp=Z(low,i);
			temp--;
			temp*=low;
            if(temp==n*(low-1))
            {
                t=i*low;
                if(t<cop)					{cop=t;r_ans=i;k_ans=low;}
                else if(t==cop && r_ans>i)  {r_ans=i;k_ans=low;}
            }
        }

	n--;
        for(i=2;i<=40;i++)
        {
            low=2;up=pow(n,1.0/i);
			while(low<=up)
            {
                mid=(low+up)>>1;
                temp=Z(mid,i);
                temp--;
                temp*=mid;
                if(temp<n*(mid-1))	low=mid+1;
                else				up=mid-1;
            }
			temp=Z(low,i);
			temp--;
			temp*=low;
            if(temp==n*(low-1))
            {
                t=i*low;
                if(t<cop)					{cop=t;r_ans=i;k_ans=low;}
                else if(t==cop && r_ans>i)  {r_ans=i;k_ans=low;}
            }
        }

        printf("%I64d %I64d\n",r_ans,k_ans);
    }
    return 0;
}


你可能感兴趣的:(hdu4430)