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.
Approach #1:
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 >= 1; --i) { if ((x<<i) < tn) { unsigned long long temp = solve(tn, i); if (temp != 0) return to_string(temp); } } return to_string(tn-1); } private: unsigned long long solve(unsigned long long num, int d) { double tn = (double) num; unsigned long long r = (unsigned long long)(pow(tn, 1.0/d)+1); unsigned long long l = 1; while (l <= r) { unsigned long long sum = 1; unsigned long long cur = 1; unsigned long long m = l + (r - l) / 2; for (int i = 1; i <= d; ++i) { cur *= m; sum += cur; } if (sum == num) return m; if (sum < num) l = m + 1; else r = m - 1; } return 0; } };
Runtime: 4 ms, faster than 49.59% of C++ online submissions for Smallest Good Base.
come from: https://leetcode.com/problems/smallest-good-base/discuss/96590/3ms-AC-C%2B%2B-long-long-int-%2B-binary-search