数学背后"计算n!在modulo p"?

时间:2017-12-26 23:43:48

标签: c++ math modulo factorial

long long x;
for (int i = 1; i <= n; i++) {
    x = (x * i) % m;
}
cout << x;

这是计算(n!)mod m的技巧(假设m> n)。但是,我不知道为什么它是真的。你能解释一下这背后的数学机制吗?

1 个答案:

答案 0 :(得分:2)

这里的基本思想是你可以在乘法之前,期间或之后取模数,并在取最终结果的模数后得到相同的值。

正如@Peter指出的那样,

(a * b) % m == ((a % m) * (b % m)) % m

对于阶乘,

n! = 1 * 2 * 3 * ... * (n-1) * n

所以我们有

n! % m = (((((((1 * 2) % m) * 3) % m) * ... * n-1) % m) * n) % m

每次迭代后取模数。

以这种方式这样做的好处是,如果你没有采用中间模数值,那么你的数字就会不会爆炸并溢出长长的类型,就像它会很快完成一样。