如何正确使用Mod 10 ^ 9 + 7

时间:2017-04-09 12:12:36

标签: java algorithm modulo largenumber

在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的指南;以便我可以在下次继续决定。

2 个答案:

答案 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类进行计算,并使用大数字。