高效算法,用于计算乘法为完美平方的所有可能对

时间:2014-11-29 19:02:44

标签: c++ math perfect-square

我有两个数字N和M. 我有效地想要计算有多少对a,b,使得1< = a< = N且1< = b< = M且a * b是完美的正方形。

我知道明显的N * M算法来计算它。但我想要比这更好的东西。 在此先感谢您的帮助。伪代码会更有帮助。

编辑:我认为可以在更好的时间内完成O(m + n)或类似的事情,但直接从先前的对计算新对,而不是迭代所有a和b。

2 个答案:

答案 0 :(得分:3)

我的方法是:

  1. s是quare和s <= N*M

    1. s进行素数分解。

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

  2. 迭代可能的分区可能有点棘手,但我很确定这是最有效的方法。

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

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

答案 1 :(得分:0)

我会选择使用素数分解的方法。 掌握1到max(N,M)之间的所有素数,让我们称之为(p0,p1,... pn)

然后任何数字a&lt; = N且b <= M可以写为the product of the pi^aithe product of the pi^bi,对于i从1到n,其中ai和bi可以是任何正整数或者0。

然后,任何产品a * b都可以写成the pi^(ai+bi),并且在写作中完美正方形的特征是所有(ai + bi)都需要是偶数(0是偶数,对于记录)。

然后你需要迭代所有(ai),使得&lt; = N,并且对于每组(ai)生成所有(bi),使得b <= M和所有(ai +) bi)是偶数。

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