题目
第一种:复杂度为n*n

#include<iostream>
using namespace std;
const   int N=2010;
int c[N][N];
const   int mod=1e9+7;
void init()
{
   
    for(int i=0;i<N;i++)
    for(int j=0;j<=i;j++)
    if(!j)  c[i][j]=1;
    else    c[i][j]=(long long)(c[i-1][j]+c[i-1][j-1])%mod;
}
int main()
{
   
    init();
    int n;
    cin>>n;
    while(n--)
    {
   
        int a,b;
        cin>>a>>b;
        printf("%d\n",c[a][b]);
    }
    return 0;
}

第二种:
复杂度为n*log n

题目

#include<iostream>
using namespace std;
const   int mod=1e9+7;
const   int N=100010;
int f[N],inf[N];//inf代表f的逆元
int qs(int a,int b)
{
   
    int res=1;
    while(b)
    {
   
        if(b&1)res=(long long)res*a%mod;
        b>>=1;
        a=(long long)a*a%mod;
    }
    return res;
}
int main()
{
   
    int n;
    cin>>n;
    f[0]=1;
    inf[0]=1;
    for(int i=1;i<N;i++)
    f[i]=(long long)f[i-1]*i%mod;
    for(int i=1;i<N;i++)
    inf[i]=(long long)inf[i-1]*qs(i,mod-2)%mod;
    while(n--)
    {
   
        int a,b;
        cin>>a>>b;
        int t=(long long)f[a]*inf[a-b]%mod*inf[b]%mod;
       printf("%d\n",t);
    }
    return 0;
}

第三种
a b 在long long (1e18)级别下使用
题目

#include<iostream>
using namespace std;
typedef long long ll;
int p;
int qs(ll a,ll b)
{
   
    int res=1;
    while(b)
    {
   
        if(b&1) res=(ll)res*a%p;
        b>>=1;
        a=(ll)a*a%p;
    }
    return res;
}
int C(ll a,ll b)
{
   
    if(b>a)    return 0;
    int res=1;
    for(int i=1,j=a;i<=b;i++,j--)
    {
   
        res=(ll)res*j%p;
        res=(ll)res*qs(i,p-2)%p;
    }
    return res;
}
int lauss(ll a,ll b)
{
   
    if(a<p&&b<p)    return C(a,b);
    return (ll)C(a%p,b%p)*lauss(a/p,b/p)%p;//自己写的总是错,不加long long或加了long long不模p会爆int
}
int main()
{
   
    int n;
    cin>>n;
    while(n--)
    {
   
       ll a,b;
        cin>>a>>b>>p;
        int ans=(ll)lauss(a,b);
        printf("%d\n",ans);
    }
    return 0;
}

第四种 高精度运算 不mod的情况下
题目

#include<iostream>
#include<vector>
using namespace std;
const   int N=100010;
int st[N],prime[N],cnt;
int sum[N];
void shai(int n)
{
   
    for(int i=2;i<=n;i++)
    {
   
        if(!st[i])
        {
   
            prime[cnt++]=i;
        }
        for(int j=0;prime[j]<=n/i;j++)
        {
   
            st[i*prime[j]]=true;
            if(i%prime[j]==0)
            break;
        }
    }
}
int get(int n,int p)
{
   
    int res=0;
    while(n)
    {
   
        res+=n/p;
        n/=p;
    }
    return res;
}
vector<int>mul(vector<int>&a,int b)
{
   
    int t=0;
    vector<int>c;
    for(int i=0;i<a.size();i++)
    {
   
        t+=a[i]*b;
        c.push_back(t%10);
        t/=10;
    }
    while(t)
    {
   
        c.push_back(t%10);
        t/=10;
    }
    return c;
}
int main()
{
   
    vector<int>ans;
    ans.push_back(1);
    int a,b;
      cin>>a>>b;
      shai(a);
    for(int i=0;i<cnt;i++)
    {
   
        int p=prime[i];
        sum[i]=get(a,p)-get(a-b,p)-get(b,p);
    }
    for(int i=0;i<cnt;i++)
    for(int j=0;j<sum[i];j++)
    ans=mul(ans,prime[i]);
    for(int i=ans.size()-1;i>=0;i--)
    printf("%d",ans[i]);
    
    return 0;
}