模型: 输入n,求 满足
K + K^1 + K^2 + K^3 +.........+ K^r = n
或者
K + K^1 + K^2 + K^3 +.........+ K^r = n -1
最小的k * r , 输出r , k , 多种情况r最小。
从小到大 枚举半径r , 二分求满足条件的 k 。
typedef long long LL ;
LL Pow(LL x , LL y){
LL s = 1 ;
for(; y ; y >>= 1 , x *= x){
if(y&1) s *= x ;
}
return s ;
}
LL ansr , ansk ;
LL sum(LL k , LL r){
return ( Pow(k , r+1) - k ) / (k -1) ;
}
LL getk(LL n , LL r){
LL L = 2 , R = pow(n , 1.0/r) + 1 , M , s ;
while(L <= R){
M = (L + R) >> 1 ;
s = sum(M , r) ;
if(s == n) return M ;
else if(s < n) L = M + 1 ;
else R = M - 1 ;
}
return -1 ;
}
void gao(LL n , LL r){
LL k = getk(n , r) ;
if(k == -1) return ;
if(k * r < ansk * ansr){
ansk = k ;
ansr = r ;
}
}
int main(){
LL n , r ;
while(scanf("%lld" ,&n) != EOF){
ansr = 1 ;
ansk = n - 1 ;
for(r = 2 ; Pow(2 , r) <= n ; r++){
gao(n , r) ;
gao(n-1 , r) ;
}
printf("%lld %lld\n" , ansr , ansk) ;
}
return 0 ;
}