解法
参考:https://blog.csdn.net/qq_23997101/article/details/73135615
数学推理题…………………………………………
本质是找a和k,使得:
所以有:
又知
即有:
综上,如果a进制化后长为k+1,那么
,就是:
- 为整数时,
- 为非整数时,
当k越大的时候a越小,k最大有多大呢?
当
时,k最大为
的时候,长度为
所以我们现在得到了2条结论:
- k确定时,a怎么选:
- 为整数时,
- 为非整数时,
- t确定时,应该从哪里开始搜:
所以算法如下:
- 初始时,t=2,算出一个长度k,再根据k算出一个a(当然这时a明显为2)。
- 如果a满足条件,那么显然它是最小的,返回
- 如果a不满足条件,那下一个k在哪呢?下一个k至少要比当前的k小,并且下一个k算出来的a要大于现在的a,所以有:
有一个坑是k=1的时候算base,明显base=n-1,但是转成浮点再转回整数可能有问题,所以如果最后也没返回结果,默认返回保底的n-1
代码:
class Solution(object):
def smallestGoodBase(self, n):
"""
:type n: str
:rtype: str
"""
n = long(n)
import math
def good_base(n,k):
tmp = math.pow(n,1.0/k)
if abs(long(tmp)-tmp)<10**-6:
return long(tmp)-1
else:
return long(tmp)
def is_good_base(n,k):
if n%k!=1:
return False
if n==1:
return True
return is_good_base((n-1)/k,k)
now = int(math.ceil(math.log(n+1, 2)-1))
while now>=1:
base = good_base(n,now)
if is_good_base(n,base):
return str(base)
now = min(int(math.ceil(math.log(n*base+1, base+1)-1)), now-1)
return str(n-1)