这是12年长春赛区现场赛的K题, 这么多年来我一直都不敢去写这个题, 我怕再不写这辈子都不会再写了。
模型: 输入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 ; }