/*
分析:
长春区赛的水题(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; }