组合数的计算

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+7;
int dp[N][N];
void cinin()
{
    for(int i=0;i<=N;i++){
        dp[i][i]=dp[i][0]=1;
    }
    for(int i=1;i<=N;i++)
        for(int j=1;j<=i;j++){
            dp[i][j]=(dp[i-1][j-1]+dp[i-1][j]);
        }
}


int main(){
    cinin();
    int n,m;
    while(cin>>n>>m){
        cout<<dp[n][m]<<endl;
    }
    
    return 0;
}

dp[n][m]指从n个数中挑选m个

还可以直接根据定义计算

//C(n,m)=n!/((n-m)!*m!)
//第一种 
void c(int n,int m){
    if(m>n) return 0;
    int a=1;
    int b=1;
    for(int i=1;i<=m;i++){
        a=a*(n-m+i);
        b=b*i;
    }
    return a/b;
}
//第二种,如果题目中要求对mod取余的话,可以直接计算逆元
 void c(int n,int m){
    if(m>n) return 0;
    int a=1;
    int b=1;
    for(int i=1;i<=m;i++){
        a=a*(n-m+i)%mod;
        b=b*i%mod;
    }
    return a*ksm(b,mod-2)%mod;
}
原文地址:https://www.cnblogs.com/Accepting/p/11399377.html