【问题标题】:Efficient algorithm to calculate all possible pair whose multiplication is a perfect quare [closed]计算乘法为完美平方的所有可能对的有效算法[关闭]
【发布时间】:2015-01-28 03:06:21
【问题描述】:

我有两个数字 N 和 M。 我想有效地计算有多少对 a,b 使得 1

我知道计算这个的明显 N*M 算法。但我想要比这更好的东西。 感谢您提前提供任何帮助。伪代码会更有帮助。

编辑:我认为它可以在更好的时间完成,可能是 O(m+n) 或类似的东西,但直接从以前的对计算新的对,而不是遍历所有 a 和 b。

【问题讨论】:

  • 我是否遗漏了什么,或者答案显然不只是取 1, 2, ..., N 和 1, 2, ..., M 的交集,然后将结果的每个成员配对与自己?
  • @iShouldUseAName: 2*8 == 16
  • @iShouldUseAName 一个快速反例:N=5,M=10。然后 (4,9) 有效,因为 4*9 = 36 = 6²。
  • 这个问题没有什么太宽泛的。它要求解决类似于例如的具体问题的解决方案。欧拉计划。我看不到任何好的算法,但也许其他人可以。

标签: c++ math perfect-square


【解决方案1】:

我的方法是这样的:

  1. s 是方格,s <= N*M

    1. s进行素数分解。

    2. 遍历这个素数分解的分区并检查哪些分区满足您的要求

遍历可能的分区可能有点棘手,但我很确定这是可能的最有效的方法。

另一方面,迭代平方数是微不足道的:

for(int i = 0, square = 0; /*whatever*/; square += 2*i++ + 1)

【讨论】:

    【解决方案2】:

    我会选择一种使用素数分解的方法。 获取 1 到 max(N,M) 之间的所有质数,我们称它们为 (p0, p1, ... pn)

    那么任何数 a

    那么,任何乘积 a*b 都可以写成,而在这种写法中,完美正方形的特征是所有 (ai+bi) 都必须是偶数(0 是偶数,为了记录)。

    然后您需要以某种方式迭代所有 (ai) 使得 a

    不确定这是否接近高效,但应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2017-05-13
      • 2021-07-17
      • 2016-09-26
      相关资源
      最近更新 更多