483. Smallest Good Base

  1. 问题
    已知: aN,3a1018 求:

    minxN,x2,s.t.nN,i=0nxi=a

  2. 数学推论

    1. n1,a=ni=0xi=xn+11x1
    2. x,y,m,nN+,xy,mn:mi=0ximi=0yini=0yi
    3. 由推论2可得:对于任意的 n ,只有一个可行解x
    4. 由推论2可得:可行解 x 随着n的增大而减小,即:
      x,y,m,nN+,m<n:mi=0xi=ni=0yix>y
    5. n=1,x=a1 且为最大可行解
    6. x=2 为可行解,则 a 的二进制表达式为全1,且x=2就是最小可行解
    7. n>1,x>2 时, a=ni=0xi>ni=02i=2n+11a2n+1
      nlog2a1
    8. nN,n>1,xN,x2: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
    9. 由推论8得: n>1 时,可行解 x 必满足:xn<ni=0xi=a<(1+x)n,即得 x<an<x+1x=an
    10. 由推论1, 9可得: n>1 时,可行解 x 存在当且仅当:x=an,xn+11x1=a
  3. 源码

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值