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

标签 java algorithm modulo largenumber

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

1^2 + 2^2+ 3^2+.....+n^2

这是

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

n^3/3 + n^2/2 + n/6

然后我需要计算另一个值

n*(n-1/2)^2

因为 n 会很大,答案可以是“answer%M”,其中 M 是 10^9+7。

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

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

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

你能帮帮我吗?一般来说,请提供使用 %M; 的指南,以便我下次可以决定。

最佳答案

(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 的一般解决方案是计算 modular inverse 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

关于java - 如何正确使用 Mod 10^9+7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306545/

相关文章:

java - Android从常量xml读取值

java - 在android中安排多个异步任务

java - 事务未激活异常 - EJB 事务状态

java - 有效移动 vector 内容的算法

c++ - 如何使用 std::copy_n 打印出 std::vector 的内容?

javascript - 模运算是否在不同的基上起作用?

java - 检测鼠标点击屏幕上的任意位置

algorithm - 在 O(n) 的列表中对数字平方进行排序?

matlab - 为大 x 计算 4^x mod 2π

c++ - 碱基转换问题