法一(逆元法):
条件,模数为质数
ll f(ll x){
ll r=1;
for(int i=2;i<=x;i++)r=r*i%mod;
return r;
}
ll getC(ll n,ll m){
return f(n)*powmod(f(n-m)*f(m)%mod,mod-2)%mod;
}
法二(暴力):容易超时和超ll:
#include <iostream>
#include <cstdio>
using namespace std;
long long C(int n,int m)
{
if(m<n-m) m=n-m; //利用组合数的性质
long long ans=1;
for(int i=m+1;i<=n;i++)
ans*=i;
for(int i=1;i<=n-m;i++)
ans/=i;
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int s=0;
s=C(n,m);
printf("%d\n",s);
}
return 0;
}
法三:数组预处理法。低范围推荐此模板
void init(){
c[1][1]=1;
for(int i=2;i<=3007;i++){
for(int j=1;j<=i;j++){
c[i][j]=c[i-1][j]+c[i-1][j-1];
c[i][j]%=mod;
}
}
}