题目链接: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; }