其他分享
首页 > 其他分享> > 组合数的两种求法

组合数的两种求法

作者:互联网

我们利用这个公式,求的组合数,然后通过打表的方式,求出答案

#include <iostream>
#include <algorithm>
using namespace std;

const int N =2010;
const int mod =1e9+7;
int d[N][N];
int dabiao(){
    for(int i=0;i<N;i++)
      for(int j=0;j<=i;j++)
        if(j==0)d[i][j]=1;
        else d[i][j]=(d[i-1][j]+d[i-1][j-1])%mod;
}
int main(){
    int n;
    scanf("%d",&n);
     dabiao();
    while(n--){
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",d[a][b]);
    }
}

二,我们利用逆元

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

typedef long long ll;
const int N =100010,mod=1e9+7;
int f[N],inter[N];

int qum(int a,int k,int p){
    int res=1;
    while(k){
        if(k&1)res=(ll)res*a%p;
        a=(ll)a*a%p;
        k>>=1;
    }   
    return res;
}//求逆元
int main(){
    int n;
    f[0]=inter[0]=1;
    for(int i=1;i<=N;i++){
        f[i]=(ll)f[i-1]*i%mod;
        inter[i]=(ll)inter[i-1]*qum(i,mod-2,mod)%mod;
    }
    scanf("%d",&n);
    while(n--){
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",(ll)f[a]*inter[b]%mod*inter[a-b]%mod);
    }
    return 0;
}

标签:两种,const,组合,int,res,ll,long,求法,include
来源: https://blog.csdn.net/yuosuph/article/details/122888274