在Java中,我需要计算前n个数的平方和,即
1^2 + 2^2+ 3^2+.....+n^2
是
n(n+1)(2n+1)/6
OR
n^3/3 + n^2/2 + n/6
然后我需要计算另一个值
n*(n-1/2)^2
因为n将是非常大的答案可以是“回答%M”,其中M是10 ^ 9 + 7.
我无法理解我应该在哪个位置进行操作%M。例如
n%M * (n+1)%M (2n+1)%M / 6
或
(n(n+1)(2n+1)/6)%M
你能帮我吗?一般情况下,请提供使用%M的指南;以便我可以在下次继续决定。
答案 0 :(得分:6)
(n(n+1)(2n+1)/6)%M
理论上是正确的,n%M * (n+1)%M * (2n+1)%M / 6
不正确。
如果n
很大,(n(n+1)(2n+1)/6)
的中间计算将溢出整数类型,因此第一种方法也不能令人满意。
计算a*b/c % M
的一般解决方案是计算c
mod M
的{{3}}(比如c'
),然后计算:{{1 }}
在这里,它更简单一点,因为你除以常数(6),并且可以在三个项中找到并删除因子2和3。在伪代码中有类似的东西:
((a%M * b%M)%M * c')%M
答案 1 :(得分:0)
按模数除法不能由/运算符(a/b) % M != ((a % M)/(b % M)) % M
生成,所以你只需要在结尾处取模数:
(n*(n+1)*(2n+1)/6) % M
有关详细信息,请阅读Modulo operation。并且不要忘记使用BigInteger
类进行计算,并使用大数字。