即计算 .
当 比较大时,就可以爆掉long long的范围了(据大佬说大概 就会爆了). 本蒟蒻就不验证了,相信大佬的 .
使用C++库函数
可以使用一个众所周知的数学定理
当 时,使用C++库函数tagamma .
double tgamma(double x);
是一个欧拉积分
理解不了不重要,只要会用下面这个结论就行了
在整数点处取值满足
代码十分简短 .
LL get_c(LL n, LL m)
{
return (LL)round(tgamma(n+1)/tgamma(m+1)/tgamma(n-m+1));
}
利用杨辉恒等式
杨辉三角,是二项式系数在三角形中的一种几何排列,
不知道怎么搞居中,但相信你们能懂我意思
显而易见,得出杨辉恒等式:
如果 不大(可以开 的空间),我们就可以开心暴力地打个表了 .
LL __[maxn][maxn];
LL get_c(LL n)
{
for (int i = 0; i <= n; i++)
for (int j = 0; j <= i; j++)
__[i][j] = (j == 0 || j == i) ? 1 : (__[i-1][j-1]+__[i-1][j])%mod;
}
利用逆元
如果 已经不满足前面两种情况,在保证模数为素数的情况下,可以用逆元求解. 可以开 的空间.
#define LL long long
const int mod = 1e9+10;
const int maxn = 1e5+10;
LL get_c(LL n, LL m)
{
static LL M = 0, in[maxn], mul[maxn] = {1}, ans[maxn] = {1};
while (++M <= n)
{
in[M] = M == 1 ? 1 : (mod - mod/M) * in[mod%M] % mod;
mul[M] = mul[M-1]*M%mod;
ans[M] = ans[M-1] * in [M] % mod;
}
return mul[n]*ans[m] % mod * ans[n-m] % mod;
}