组合数取模: Cmn % p
三个链接表示的是该种方法的定理定义之类的~怕三种方法合在一起太长(ノ`Д)ノ
一、杨辉三角打表求组合数——1≤m≤n≤1000,1≤p≤ 109
int Combination(int n)
{
int i,j;
a[0][0]=1;
for(i=0;i<=n;i++)
{
a[i][0]=a[i][i]=1;
for(j=1;j<i;j++)
{
a[i][j]=(a[i-1][j-1]+a[i-1][j])%mod;
}
}
return 0;
}
二、乘法逆元来直接求组合数——n,m不大于10^5
其中三种求逆元方法及模板请戳蓝↑~
三、Lucas定理求组合数——n,m大于10^5,并且p是素数
Lucas定理处理比较大的数。
long long Pow(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b&1)
{
b--;
ans=(ans*a)%p;
}
b>>=1;
a=(a*a)%p;
}
return ans;
}
long long C(long long n,long long m)
{
if(n<m)
return 0;
long long a=1,b=1;
while(m)
{
a=(a*n)%p;
b=(b*m)%p;
m--;
n--;
}
return (a*Pow(b,p-2))%p;
}
long long Lucas(long long n,long long m)
{
if(m==0)
return 1;
return Lucas(n/p,m/p)*C(n%p,m%p)%p;
}
ps:
组合数好像大部分都是高中的知识○| ̄|_
啊啊啊就不该让强迫症来写博客啊摔!