c++ - 在 C++ 中计算二项式系数模块素数 p
问题描述
问题陈述:计算二项式系数 C(n,k) mod p。这里 p 是一个素数。
我在网上做了一些研究,但我仍然不明白为什么下面的代码适用于这个问题:
factorial[0] = 1;
for (int i = 1; i <= MAXN; i++) {//compute factorial
factorial[i] = factorial[i - 1] * i % m;
}
long long binomial_coefficient(int n, int k) {
return factorial[n] * inverse(factorial[k] * factorial[n - k] % m) % m;//I don't get it why we have to multiply with inverse(factorial[k] * factorial[n - k] % m)
}
我知道模逆的定义,但我仍然很困惑它在这里如何相关。有人可以帮我澄清这段代码吗?
解决方案
阶乘公式 C(n, k) = n! / (k! (n-k)!)
可以改写为C(n, k) k! (n-k)! = n!
。然后:
双方
mod p
:C(n, k) k! (n-k)! ≡ n! mod p
;乘以模逆
C(n, k) k! (n-k)! inverse(k! (n-k)!) ≡ n! inverse(k! (n-k)!) mod p
:简化
a inv(a) = 1
:C(n, k) ≡ n! inverse(k! (n-k)!) mod p
。
后者相当于C(n, k) mod p = ((n! mod p) (inverse(k! (n-k)!) mod p)) mod p
。
推荐阅读
- javascript - 使用拼接方法时如何保留先前的数组
- apache-spark - 无法针对 hadoop 3.2.0 构建 spark2.4.3
- r - 重新整理眼动追踪数据
- python - 如何使用 Python 将写为“h.mm”的时间转换为十进制形式?
- c++ - 使用可变参数模板和运行时索引构造 iterator_range
- php - Google Ads API 未发送正确的关键字估算值
- arrays - 如何根据唯一 ID Nr 将工作表 1 中的值添加到同一 Excel 文件中的另一个工作表?
- python - 为什么我的代码每隔一秒打印一次 cidr 范围?
- reactjs - 尝试从上下文消费者修改状态,但状态仅受我模板中最后一个消费者的影响
- angular-material - DateTimePicker 不适用于角度材料