【问题标题】:Finding the number of even perfect square proper divisors of a given number N求给定数 N 的偶数完全平方因数
【发布时间】: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


【解决方案1】:

不清楚你说的是哪个公式,但如果你说的是列表如何

  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 = 22 * 3 2 并且认为你有一个列表 A = {} 最初是空的,我们会找到所有除数。那时我想你知道质数分解是如何完成的。 现在,从简单的组合中,您可以选择三种可能的 2 来将其包含在每个除数中。 假设您不想计算包含任意数量 2 的除数意味着您希望 20=1 in

因此,如果您选择 20 和任意数量的 3,那么您可以选择 20 * 30, 20 * 31, 20 * 32 因此,对于 20 和任意数量的 3:列表包含:20 * 30 = 1, 20 sup> * 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 出现两次时继续。那么你就有了列表中的所有除数。

这可以使用筛子轻松实现。

【讨论】:

  • 谢谢你的回答,但这不是我要说的问题……我理解这个方法并在筛子中实现了它,但是这里的社论(hackerrank.com/challenges/mehta-and-his-laziness/editorial)进一步减少了这个方法并在“更聪明的策略”中提到了一个更好的方法,它是带有2^e * p_2^e2的那个......我也理解那部分的文字解释,但我不明白代码行“ divisors[j] += divisors[j] / e" 与理论解释有关。
  • 你应该在这里粘贴代码段..至少包含代码段的函数..如果没有看到你正在谈论的代码,我无法帮助你..可能是它的一部分降低复杂性的预计算......在你的qs中添加代码段。
  • 因为代码在我提供的链接内......并且它需要用户登录才能解锁。我不知道在另一个论坛上分享他们的代码是否合适,但你能试试我在最后评论中的链接吗?代码在那个链接里面...谢谢..
  • 我会在看到代码后尝试给你答案,当我有时间的时候。但我很欣赏你的想法,但大多数时候你会发现向其他用户提供一些链接并要求他们登录该网站然后回答你的问题是不合适的。
  • 是的...对此我很抱歉...我还询问网站是否可以在这里发布代码,但他们还没有回复我...一旦我获得许可我会在这里发布完整的代码...谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多