法一(逆元法):

条件,模数为质数

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;
        }
    }
}