返回格式 x^y 的第 i 个数字,其中 x 和 y 是整数
Posted
技术标签:
【中文标题】返回格式 x^y 的第 i 个数字,其中 x 和 y 是整数【英文标题】:Return the ith number of the format x^y, where x and y are integers 【发布时间】:2018-03-05 08:58:18 【问题描述】:x 和 y 是大于 1 的整数。 特殊数可以表示为 x^y。 请注意,特殊数字序列按升序排列(4、8、9、16、25、27、32,...)。 给定一个整数 i,程序应该返回第 i 个特殊数字。
i=0 -> num=4
i=4 -> num=25
想要一些见解。在一家公司的编码回合中遇到了这个问题。蛮力以 TLE 告终。
编辑 1:找到一个链接:https://codegolf.stackexchange.com/questions/78985/find-the-n-th-perfect-power。
Edit-2:我分享了 codegolf 链接以帮助检查一些已经可用且预计会超过时间限制的解决方案。我尝试了 Mathematica 解决方案和 Sage 解决方案方法,都面临 TLE。
【问题讨论】:
这是题外话。你所做的只是重新发布一个代码高尔夫问题,没有显示出解决它的努力(更不用说那里给出了一个单行数学解决方案) 注意代码高尔夫问题允许x=1
,因此解决方案需要一个(微不足道的)调整。
【参考方案1】:
这个问题等价于找到一个整数j
,其中log_j k
是一个整数,而j
在一个具有上限k
的序列中,使得sum [floor(log_j k) - 1 | j <- [2..floor(sqrt k)] == i
我们可以通过有限迭代的二进制搜索粗略估计i
th 元素的位置。如果我们猜测m^2
处的数字,可以算出的最高基数是:
m
然后我们可以检查较低的碱基并将它们的对数计数相加。例如i = 10
:
Guess: 10^2
Highest base: 10
Then at minimum we have (10 - 1) + (floor(log2 (10^2)) - 1)
= 15 elements. Too many.
Guess: 5^2
Highest base: 5
Minimum element count: (5 - 1) + (floor(log2 (5^2)) - 1) = 8
Iterate over logs:
-- Because of the exponential nature of the problem,
-- if the guess is too large, the bulk of the elements will appear
-- early in the iteration; and if it's too small, the limit on
-- exponents will drop early allowing for early exit in either case.
[floor(logBase x 25) - 1 | x <- [2..4]] = [3,1,1]
sum ([1] ++ [3,1,1]) = 6. Too few.
Guess: 7^2
Highest base: 7
Minimum element count: (7 - 1) + (floor(log2 (7^2)) - 1) = 10
Iterate over logs:
[floor(logBase x 49) - 1 | x <- [2..6]] = [4,2,1,1,1]
sum ([1] ++ [4,2,1,1,1]) = 10
Answer: 7^2
【讨论】:
以上是关于返回格式 x^y 的第 i 个数字,其中 x 和 y 是整数的主要内容,如果未能解决你的问题,请参考以下文章