对于分成两块
求组合数求余——这里用杨辉三角
求快速幂
#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定理: