找出给定数N的偶数完全平方正整除数的数目。

问题描述 投票:1回答:1

我试图在HackerRank上解决一个问题(问题链接: https:/www.hackerrank.comchallengesmehta-and-his-lazinessproblem该问题要求程序计算给定数字N的所有正整除数中,给定数字N的除数是正整除数的概率,例如,给定N=36,正整除数集是{1,2,3,4,6,9,12,18},只有4是正整除数。

例如,给定N=36,正数除数集是{1,2,3,4,6,9,12,18},只有4是偶数完全平方。则概率将为18.再比如,N=900,正除数集为{1,2,3,4,6,9,12,18},只有4是偶数完全平方,则概率将为18.

又如N=900,共有26个正除数,其中3个{4,36,100}是偶数完全平方,概率为326。概率将是326。

这2个例子取自HackerRank上的问题描述。我解决了这个问题,并通过了所有测试,但我的解决方案不是最优的。所以我阅读了 "更聪明的战略" 在HackerRank提供的社论中提到。我理解了理论上的解释,但我真的被这句话搞糊涂了。

divisors[j] += divisors[j] / e

我不知道把HackerRank上的社论中的解释和完整代码复制粘贴到这里是否合适(https:/www.hackerrank.comchallengesmehta-and-his-lazinesseditorial)因为需要用户先登录(可以使用Gmail、Facebook、GitHub和LinkedIn账号)并解锁(无需付费,是免费的),所以我只是粘贴了一行字,我真的很困惑。希望有人也能进入小编的视野,回答我以下的问题。

我理解其他解法的解释和代码,但我就是不明白为什么这个最优方法的除数列表更新要这样做,divisors[j]是循环上一个周期的值,怎么能用这个来计算当前质数和具体指数所产生的除数呢?我认为它e而不是(e+1)是因为初始化了列表中所有的1(已经算出1是每个数的除数)。另外,我觉得这种更新方法与避免重复计算有关,但我实在不明白这个公式是怎么推导出来的?

比如,36=2^2*3^2。

循环2^1后,divisors[36]应该是2。然后在循环2^2之后,除数[36]应该是3(22+2)。在循环3^1之后,除数[36]应该是6(31+3)。然后在3^2之后,除数[36]应该是9 (62+6)。

我的猜测是,每一次循环之后,divisors都是将当前值引起的被除数的可能性相加,例如,在36的情况下。

val : divisors list 2^1 : {1,2} 2^2 : {1,2,4}。 3^1 : {1,2,4,3,6,12} 3^2 : {1,2,4,3,6,12,9,18,36}

但是我不知道这个公式是怎么用数学方法推导出来的... ... 谁能给我解释一下?非常感谢您...

python algorithm math number-theory perfect-square
1个回答
0
投票

它不清楚您正在谈论的是哪个公式,但如果您正在谈论如何将列表

  val : divisors list
  2^1 : {1,2}
  2^2 : {1,2,4}
  3^1 : {1,2,4,3,6,12}
  3^2 : {1,2,4,3,6,12,9,18,36}

那么答案就在这里 你的数字是36=2。2 * 3 2 并认为你有一个列表A={},它最初是空的,我们将找到所有的除数。在这一点上,我想你知道质因式是如何完成的.现在,从简单的组合学来看,你有三种可能的选择,分别是 2 假设你不想计算包含任何数量的除数,你可以将它包含在每一个除数中。2 意思是你要20=1

所以,如果你选择20 以及任何数量的 3 那么你有可能的选择20 * 30, 20 * 31, 20 * 32 所以,对于20 和任意数量的3:列表包含。20 * 30 = 1, 20 * 31 = 3, 20 * 32 = 9

所以, A = {1, 3, 9}

那你就准确地选择 2 一次又一次 3 那么你有可能的选择21 * 30, 21 * 31, 21 * 32

为21 和任意数量的3:list包含。21 * 30 = 2, 21 * 31 = 6,21 * 32 = 18

所以, A = {1, 3, 9} U {2, 6, 18} = {1, 2, 3, 6, 9, 18} 等到 2 那么你就有了列表中的所有除数。

这可以用筛子轻松实现。

© www.soinside.com 2019 - 2024. All rights reserved.