问题
已知: a∈N,3≤a≤1018 求:
minx∈N,x≥2,s.t.∃n∈N,∑i=0nxi=a数学推论
- n≥1,a=∑ni=0xi=xn+1−1x−1
- ∀x,y,m,n∈N+,x≤y,m≤n:∑mi=0xi≤∑mi=0yi≤∑ni=0yi
- 由推论2可得:对于任意的
n
,只有一个可行解
x - 由推论2可得:可行解
x
随着
n 的增大而减小,即:
∀x,y,m,n∈N+,m<n:∑mi=0xi=∑ni=0yi⇒x>y - n=1时,x=a−1 且为最大可行解
- 若
x=2
为可行解,则
a
的二进制表达式为全1,且
x=2 就是最小可行解 -
n>1,x>2
时,
a=∑ni=0xi>∑ni=02i=2n+1−1⇒a≥2n+1
⇒n≤log2a−1 -
∀n∈N,n>1,∀x∈N,x≥2:∑ni=0xi<(1+x)n
证明:
n=2 时, ∑2i=0xi=1+x+x2<1+2x+x2=(1+x)2
假设 n 成立,则n+1 时,
∑n+1i=0xi=∑ni=0xi+xn+1<(1+x)n+xn+1<(1+x)n+x(1+x)n=(1+x)n+1 - 由推论8得:
n>1
时,可行解
x
必满足:
xn<∑ni=0xi=a<(1+x)n ,即得 x<a√n<x+1⇒x=⌊a√n⌋ - 由推论1, 9可得:
n>1
时,可行解
x
存在当且仅当:
x=⌊a√n⌋,xn+1−1x−1=a
源码
import math
def binary_base_all_one(a):
while (a & 1):
a = (a >> 1)
return a == 0
class Solution(object):
def smallestGoodBase(self, a):
"""
:type n: str
:rtype: str
"""
a = int(a)
if binary_base_all_one(a):
return '2'
max_n= int(math.log(a, 2))
for n in range(max_n, 2, -1):
x = int(a**((n - 1)**-1))
if (x**n - 1) // (x - 1) == a:
return str(x)
return str(a - 1)