做网站的公司怎么找客户,企业邮箱的登录入口,php学建网站,辽宁做网站题目
对于给定的整数 n, 如果n的k#xff08;k2#xff09;进制数的所有数位全为1#xff0c;则称 k#xff08;k2#xff09;是 n 的一个好进制。
以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。
示例 1#xff1a;
输入#xff1a;“13” 输…
题目
对于给定的整数 n, 如果n的kk2进制数的所有数位全为1则称 kk2是 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的kk2进制数的所有数位全为1那么可以表示为一个等比数列相加
因此根据等比数列求和公式可得 变形得 因为n的取值范围是 [3, 10^18]并且k2,根据log函数的单调性可得:m60
二项式定理
根据二项式定理可得 又因为 二式结合可得 最终可求得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 mmaxL;m1;m--){int k (int) Math.pow(num, 1.0 / m);long cur1,pow1;for(int i0;im;i){pow*k;curpow;}if(curnum)return String.valueOf(k);}return String.valueOf(num-1);}
}