《算法竞赛进阶指南》0x36 组合计数

题目链接:https://www.acwing.com/problem/content/213/

使用乘法逆元计算组合数,二项式定理展开就可以得到结果。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn =  1010;
const int mod = 10007;
int inv[maxn];
int exgcd(int a,int b,int& x,int& y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    int gcd=exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-y*(a/b);
    return gcd;
}
int main(){
    for(int i=1;i<=1000;i++){//求解逆元 
        int x,y;
        exgcd(i,mod,x,y);
        inv[i]=x;
    }
    int a,b,k,n,m;
    cin>>a>>b>>k>>n>>m;
    a%=mod;
    b%=mod;
    int ans=1;
    for(int i=1;i<=n;i++){
        ans=((ans*inv[i]%mod)*(k+i-n))%mod;
    }
    for(int i=1;i<=n;i++) ans=(ans*a)%mod;
    for(int i=1;i<=m;i++) ans=(ans*b)%mod;
    ans=(ans%mod+mod)%mod;
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/randy-lo/p/13279207.html