寻找不同基数的数字表示

时间:2016-11-15 08:22:44

标签: algorithm numbers

我最近在遇到这个问题时解决了一个问题:APAC Round E Q2

基本上,该问题要求找到最小的基数(> 1),其中如果写入数字(输入),则该数字仅包括1。如果在基数2中表示为3,则变为1(仅由1组成)。

现在,我试图通过蛮力的方式解决这个问题,试图从2到数字找到这样的基数。但是限制要求效率更高。

任何人都可以提供一些帮助来解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

以下是一条建议:可以表示为基座x中的所有1的数字b可以写为x = b^n + b^(n-1) + b^(n-2) + ... + b^1 + 1

如果您从此数字中减去1,则最终会得到一个可被b分割的数字: b^n + b^(n-1) + b^(n-2) + ... + b^1,其代表为111...110。除以b表示将其向右移动一次,因此结果数字现在为b^(n-1) + b^(n-2) + ... + b^1111...111,比之前少一位数。现在,您可以重复此过程,直至到达0

例如13 1113基础13 - 1 = 12 --> 110 12 / 3 = 4 --> 11 4 - 1 = 3 --> 10 3 / 3 = 1 --> 1 1 - 1 = 0 --> 0 Done => 13 can be represented as all 1s in base 3

1

因此,为了检查是否可以使用基础b中的所有b来编写给定数字,您可以在减去{{1}之后检查该数字是否可以1除以}}。如果没有,你可以立即从下一个基地开始。

这也是相当暴力的,但它不进行任何基本转换,每次迭代只进行一次减法,一次除法和一次mod操作。

答案 1 :(得分:1)

我们可以通过识别序列中可达到的最高功率与最小基数O( (log2 n)^2 )对应,并使用几何和的公式来解决2复杂性:

1 + r + r^2 + r^3 ... + r^(n-1) = (1 - r^n) / (1 - r)

Renaming the variables, we get: 

  n = (1 - base^power) / (1 - base)

现在我们只需要检查power(floor(log2 n) + 1)2的{​​{1}},并且对于每个给定的功率,使用二进制搜索作为基数。例如:

n = 13:

  p = floor(log2 13) + 1 = 4:

    Binary search for base:

    (1 - 13^4) / (1 - 13) = 2380

    ...

    No match for power = 4. 

    Try power = 3:

    (1 - 13^3) / (1 - 13) = 183

    (1 - 6^3) / (1 - 6) = 43

    (1 - 3^3) / (1 - 3) = 13 # match

对于n左右10^18,我们最多可能需要(floor(log2 (10^18)) + 1)^2 = 3600次迭代。