C++ “背后的数学”;计算n!在模p下;? 长x; 对于(int i=1;i

C++ “背后的数学”;计算n!在模p下;? 长x; 对于(int i=1;i,c++,math,modulo,factorial,C++,Math,Modulo,Factorial,来说,这里的基本思想是,你可以在乘法之前、期间或之后取模,在取最终结果的模之后得到相同的值 正如@Peter指出的 long long x; for (int i = 1; i <= n; i++) { x = (x * i) % m; } cout << x; 对于阶乘 (a * b) % m == ((a % m) * (b % m)) % m 所以我们有 n! = 1 * 2 * 3 * ... * (n-1) * n 每次迭代后取模 这样做的好处是,您的

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

正如@Peter指出的

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

(a * b) % m == ((a % m) * (b % m)) % m
所以我们有

n! = 1 * 2 * 3 * ... * (n-1) * n
每次迭代后取模



这样做的好处是,您的数字不会像不取中间模值时那样迅速膨胀并溢出long-long类型。

这里的基本思想是,您可以在乘法之前、期间或之后取模,并在取最终结果的模后获得相同的值中尉

正如@Peter指出的

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

(a * b) % m == ((a % m) * (b % m)) % m
所以我们有

n! = 1 * 2 * 3 * ... * (n-1) * n
每次迭代后取模



这样做的好处是,你的数字不会像不取中间模数值那样迅速膨胀并溢出long-long类型。

这个问题应该移到@hvd well,而不是应该关闭;-)不。在这种情况下,m应该大于n。这里没有诀窍,这很简单。你认为哪一部分涉及技巧?如果你想要一个简短的答案,有一个证明,我很肯定你可以找到它,如果你在谷歌上键入“模算术属性”,这个问题应该移到@hvd,而不是应该关闭;-)不。在这种情况下,m应该大于n。这里没有技巧,这很简单。你认为哪一部分涉及技巧?如果你想要一个简短的答案,有一个证明,我很确定如果你在谷歌上键入“模块算术属性”,你会找到它