我试图解决关于 HackerRank 的一个问题(问题链接:https ://www.hackerrank.com/challenges/mehta-and-his-laziness/problem ),该问题涉及计算给定数 N 的偶数完全平方真因数的数量. 这个问题要求程序计算给定数 N 的一个除数在所有 N 的真除数中是偶数平方的概率。
例如,给定 N = 36,真因数的集合是 {1,2,3,4,6,9,12,18},只有 4 是一个偶数平方。概率为 1/8。
另一个例子是 N = 900,总共有 26 个真除数,其中 3 个 {4,36,100} 是完全平方。概率为 3/26。
这两个例子取自 HackerRank 上的问题描述。我解决了这个问题并通过了所有测试,但我的解决方案不是最优的。于是我阅读了HackerRank 提供的社论中提到的“Smarter Strategy” 。我理解了理论解释,但我真的被这条线弄糊涂了
divisors[j] += divisors[j] / e
我不知道是否适合从 HackerRank 上的社论(https://www.hackerrank.com/challenges/mehta-and-his-laziness/editorial)复制并粘贴解释和完整代码,因为它需要用户首先登录(可以使用Gmail、Facebook、GitHub和LinkedIn帐户)并解锁(无需付费,它是免费的),所以我只是粘贴了我真的很困惑的那一行。我希望有人也可以访问社论并回答我的以下问题。
我理解其他解决方案的解释和代码,但我只是不明白为什么要以这种方式更新除数列表以获得最佳方法。divisors[j] 是循环最后一个循环的值,如何使用它来计算当前素数和特定指数产生的除数?我认为它 /e 而不是 /(e+1) 是因为列表中所有 1 的初始化(已经计算了 1 是每个数字的除数)。另外,我认为这种更新方法与避免重复计算有关,但我真的不明白这个公式是如何得出的?
例如,36 = 2^2 * 3^2。
在循环 2^1 之后,divisors[36] 应该是 2。然后在循环 2^2 之后,divisors[36] 应该是 3 (2/2+2)。在循环 3^1 之后,除数 [36] 应该是 6 (3/1+3)。然后在 3^2 之后,除数 [36] 应该是 9 (6/2+6)。
我的猜测是,在每个循环之后,除数会添加由当前值引起的除数的可能性,例如,在 36 的情况下:
val : 除数列表
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}
但我不知道这个公式是如何从数学上推导出来的……谁能给我解释一下?太感谢了...