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

Java 如何正确使用Mod 10^9+;7.,java,algorithm,modulo,largenumber,Java,Algorithm,Modulo,Largenumber,在Java中,我需要计算前n个数字的平方和,即 1^2 + 2^2+ 3^2+.....+n^2 那是 n(n+1)(2n+1)/6 或 然后我需要计算另一个值 n*(n-1/2)^2 因为n将非常大,所以答案可以是“答案%M”,其中M是10^9+7 我无法理解我应该在哪个计算点执行操作%M。例如 n%M * (n+1)%M (2n+1)%M / 6 或 你能帮我一下吗。一般来说,请提供使用%M的指南;这样我下次再决定 /operator:(a/b)%M!无法按模进行除法((a

在Java中,我需要计算前n个数字的平方和,即

1^2 + 2^2+ 3^2+.....+n^2
那是

n(n+1)(2n+1)/6   

然后我需要计算另一个值

n*(n-1/2)^2
因为n将非常大,所以答案可以是“答案%M”,其中M是10^9+7

我无法理解我应该在哪个计算点执行操作%M。例如

n%M * (n+1)%M (2n+1)%M /  6 


你能帮我一下吗。一般来说,请提供使用%M的指南;这样我下次再决定

/operator:
(a/b)%M!无法按模进行除法((a%M)/(b%M))%M
,因此您只需要在末尾取模:

(n*(n+1)*(2n+1)/6) % M
欲了解更多信息,请阅读。不要忘了使用
biginger
类来计算真正的大数字。

(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
(比如
c'
)的值,然后计算:
((a%M*b%M)%M*c')%M

在这里,它稍微简单一点,因为你要除以一个常数(6),可以找到并删除三项中2和3的因子。伪代码中的类似内容:

n1 := n
n2 := n+1
n3 := 2n+1
if n1 % 2 == 0 { n1 /= 2 } else { n2 /= 2 }
if n1 % 3 == 0 { n1 /= 3 } else if n2 % 3 == 0 { n2 /= 3 } else { n3 /= 3}
return (((n1 % M) * (n2 % M)) % M * (n3 % M)) % M

对于简单常数,可以使用wolfram alpha来计算此逆。例如,=1666668.你为什么不这样做。。如果n2%2==0(n2/=2}else{n3/=2}…有什么特别的原因吗?哦…明白了…如果n%2不是0,那么它是奇数,所以n+1肯定是偶数。所以n2%2肯定是零
n3
总是奇数。n1和
n2
中正好有一个是偶数。
n1
n2
n3
中正好有一个是可以被3整除的。如果你的模是素数,那么在10^9+7的情况下,您可以使用公式c^(M-2)mod M来计算c mod M的模逆,这可以用fast pow轻松完成。这一定是以前问过的。搜索
10^9+7
可能会很困难。您可以尝试
100000007
(n*(n+1)*(2n+1)/6) % M
n1 := n
n2 := n+1
n3 := 2n+1
if n1 % 2 == 0 { n1 /= 2 } else { n2 /= 2 }
if n1 % 3 == 0 { n1 /= 3 } else if n2 % 3 == 0 { n2 /= 3 } else { n3 /= 3}
return (((n1 % M) * (n2 % M)) % M * (n3 % M)) % M