计算乘法为完美平方的所有可能对的有效算法[关闭]
Posted
技术标签:
【中文标题】计算乘法为完美平方的所有可能对的有效算法[关闭]【英文标题】: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²。
这个问题没有什么太宽泛的。它要求解决类似于例如的具体问题的解决方案。欧拉计划。我看不到任何好的算法,但也许其他人可以。
【参考方案1】:
我的方法是这样的:
s
是方格,s <= N*M
对s
进行素数分解。
遍历这个素数分解的分区并检查哪些分区满足您的要求
遍历可能的分区可能有点棘手,但我很确定这是可能的最有效的方法。
另一方面,迭代平方数是微不足道的:
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
不确定这是否接近高效,但应该可以正常工作。
【讨论】:
以上是关于计算乘法为完美平方的所有可能对的有效算法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章