【发布时间】:2020-09-11 03:48:44
【问题描述】:
我试图解决 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。
这 2 个示例取自 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}
但我不知道这个公式是如何从数学上推导出来的……谁能给我解释一下?非常感谢...
【问题讨论】:
-
我们无法合理地回答有关我们看不到的代码的问题。能否将相关代码粘贴到问题中?
-
我很想要但是在HackerRank的编辑部,需要用户登录他们的网站(可以使用Gmail、Facebook、GitHub。LinkedIn账号)并解锁(不需要付钱) , 这是免费的)。不知道能不能直接发到这里,可以试试点击我提供的链接,然后登录访问社论吗?
-
另外,你怎么知道你的解决方案不是最优的?您的解决方案可能不同和最佳。
-
@PresidentJameK.Polk 因为社论提供了不同的解决方案,我的和时间复杂度O(N log N)的一样,而最优的时间复杂度比这个好。
标签: python algorithm math number-theory perfect-square