题目
对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。
以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。
- 示例 1:
输入:“13”
输出:“3”
解释:13 的 3 进制是 111。
- 示例 2:
输入:“4681”
输出:“8”
解释:4681 的 8 进制是 11111。
- 示例 3:
输入:“1000000000000000000”
输出:“999999999999999999”
解释:1000000000000000000 的 999999999999999999 进制是 11。
提示:
- n的取值范围是 [3, 10^18]。
- 输入总是有效且没有前导 0。
等比数列求和
如果n的k(k>=2)进制数的所有数位全为1,那么可以表示为一个等比数列相加
因此根据等比数列求和公式可得
变形得:
因为n的取值范围是 [3, 10^18]并且k>=2,根据log函数的单调性可得:m<60
二项式定理
根据二项式定理可得
又因为
二式结合可得
最终可求得k
解题思路
- 根据等比数列求和,我们可以快速得到m的最大值,从而缩小我们的搜索范围
2. 根据上一步得出的m的取值范围进行遍历,通过二项式定理得出的结论
可以求出k值,再检验当前k值能否组成n
代码
class Solution {public String smallestGoodBase(String n) {long num = Long.parseLong(n);int maxL = (int) Math.floor(Math.log(num) / Math.log(2));for (int m=maxL;m>1;m--){int k = (int) Math.pow(num, 1.0 / m);long cur=1,pow=1;for(int i=0;i<m;i++){pow*=k;cur+=pow;}if(cur==num)return String.valueOf(k);}return String.valueOf(num-1);}
}