我有两个数字N和M. 我有效地想要计算有多少对a,b,使得1< = a< = N且1< = b< = M且a * b是完美的正方形。
我知道明显的N * M算法来计算它。但我想要比这更好的东西。 在此先感谢您的帮助。伪代码会更有帮助。
编辑:我认为可以在更好的时间内完成O(m + n)或类似的事情,但直接从先前的对计算新对,而不是迭代所有a和b。
答案 0 :(得分:3)
我的方法是:
s
是quare和s <= N*M
对s
进行素数分解。
遍历此素数分解的分区,并检查哪些分区满足您的要求
迭代可能的分区可能有点棘手,但我很确定这是最有效的方法。
另一方面,迭代平方数字是微不足道的:
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可以写为和,对于i从1到n,其中ai和bi可以是任何正整数或者0。
然后,任何产品a * b都可以写成,并且在写作中完美正方形的特征是所有(ai + bi)都需要是偶数(0是偶数,对于记录)。
然后你需要迭代所有(ai),使得&lt; = N,并且对于每组(ai)生成所有(bi),使得b <= M和所有(ai +) bi)是偶数。
不确定这附近是否有效,但应该可以正常工作。