【问题标题】:Math behind "compute n! under modulo p"?“计算 n!在模 p 下”背后的数学?
【发布时间】:2017-12-26 23:43:48
【问题描述】:
long long x;
for (int i = 1; i <= n; i++) {
    x = (x * i) % m;
}
cout << x;

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

【问题讨论】:

  • 这个问题应该移到math.stackexchange.com
  • @hvd 比它应该被关闭 ;-)
  • 没有。在这种情况下,m 应该大于 n。
  • 这里没有技巧,一切都很简单。你觉得哪一部分有技巧?
  • 如果您想要一个简短的答案,这里有一个证明,如果您在 google 上输入“模算术属性”,我很确定您可以找到它

标签: c++ math modulo factorial


【解决方案1】:

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

正如@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

每次迭代后取模数。


这样做的好处是,您的数字不会爆炸并溢出您的 long long 类型,如果您不采用中间模数值,它会很快完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2014-06-10
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多