返回格式 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

我们可以通过有限迭代的二进制搜索粗略估计ith 元素的位置。如果我们猜测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 是整数的主要内容,如果未能解决你的问题,请参考以下文章

CDQ分治

[模板]树状数组

学习:树状数组&线段树

树状数组模板1

求这样的两个数据:5位数=2*4位数,9个数字各不相同

朴素贝叶斯算法笔记