题目:
For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1.
Now given a string representing n, you should return the smallest good base of n in string format.
Example 1:
Input: "13" Output: "3" Explanation: 13 base 3 is 111.
Example 2:
Input: "4681" Output: "8" Explanation: 4681 base 8 is 11111.
Example 3:
Input: "1000000000000000000" Output: "999999999999999999" Explanation: 1000000000000000000 base 999999999999999999 is 11.
Note:
- The range of n is [3, 10^18].
- The string representing n is always valid and will not have leading zeros.
tips:要求最小的base,换句话说就是要求全部为1的数列长度最长,题目要求值不超过10^18,base最小为2,所以全部为1的数列长度最长为62位,暴力遍历,复杂度也不算很大。
class Solution {
public:
string smallestGoodBase(string n) {
unsigned long long tn=(unsigned long long)stoll(n);
unsigned long long x=1;
for (int i=62;i>=2;i--) {
if ((x<<i)<tn) {
unsigned long long cur=mysolve(tn,i);
if (cur!=0) return to_string(cur);
}
}
return to_string(tn-1);
}
unsigned long long mysolve(unsigned long long n,int d) {
double tn=(double) n;
unsigned long long right=(unsigned long long)(pow(tn,1.0/d)+1);
unsigned long long left=2;
while (left<=right){
unsigned long long mid=left+(right-left)/2;
unsigned long long sum=1,cur=1;
for (int i=1;i<=d;i++) {
cur*=mid;
sum+=cur;
}
if (sum==n) return mid;
if (sum>n) right=mid-1;
else left=mid+1;
}
return 0;
}
};