我最近在遇到这个问题时解决了一个问题:APAC Round E Q2
基本上,该问题要求找到最小的基数(> 1),其中如果写入数字(输入),则该数字仅包括1。如果在基数2中表示为3,则变为1(仅由1组成)。
现在,我试图通过蛮力的方式解决这个问题,试图从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^1
或111...111
,比之前少一位数。现在,您可以重复此过程,直至到达0
。
例如13
111
,3
基础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
次迭代。