对于
分成两块
求组合数求余
——这里用杨辉三角
求快速幂
#include <iostream>
using namespace std;
const int mod=10007;
const int N=1005;
long long a,b,k,n,m,mi,ans;
long long yh[N][N];
void myhSt(int n){//杨辉三角
for(int i=0;i<=n;i++){
yh[i][0]=yh[i][i]=1;
}
for(int i=2;i<=n;i++)
for(int j=1;j<n;j++){
yh[i][j]=yh[i-1][j-1]+yh[i-1][j];
yh[i][j]%=mod;
}
}
long long qmi(int a,int n){
long long res=1;
a%=mod;
while(n){
if(n&1) res=res*a%mod;
n>>=1;
a=a*a%mod;
}
return res;
}
int main(int argc, char** argv) {
cin>>a>>b>>k>>n>>m;
myhSt(k);
a%=mod; b%=mod;
ans=qmi(a,n);
ans=ans*qmi(b,m)%mod;
ans=ans*yh[k][m]%mod;
cout<<ans%mod<<endl;
return 0;
} 一开始我求是把C的分子和分母都先mod在相除,但这样会出错 这里数小用杨辉三角,数大用Lucas定理(卢卡斯)
Lucas定理: )

京公网安备 11010502036488号