#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 1, mod = 1e9 + 7;
unsigned int C[N], g[N];
int main()
{
int n, ans = 1;
scanf("%d", &n);
C[0] = g[0] = g[1] = 1;
//逆元
for (int i = 2; i < n / 2 + 1; ++i)
g[i] = (1ULL * g[mod % i] * (mod - mod / i)) % mod;
//(n-m+1)*(n-m+2)*...*(n-m+m)/1*2*...*m
//上面乘多一个,下面乘多一个,转化为乘逆元
for (int i = 1; i <= n / 2 + 1; ++i)
C[i] = (1ULL * ((1ULL * C[i - 1] * (n - i)) % mod) * g[i]) % mod;
return 0;
}
这篇文章介绍了如何使用C++编程语言实现计算阶乘和组合数的高效算法,通过逆元和组合公式展示了如何计算(n-m+1)*...*(n-m+m)的简化版本。重点在于理解逆元在计算中的作用和应用。
&spm=1001.2101.3001.5002&articleId=118058857&d=1&t=3&u=76939d16c8a546ce839885c8c8eb129e)
187

被折叠的 条评论
为什么被折叠?



