即計算 .
當 比較大時,就可以爆掉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;
}