P1313 计算系数
算法:二项式定理,同余模定理, 快速幂
题意:
思想:从题意中很容易看出需要二项式定理,根据二次项式定理能求出来((ax)^n)*(by)^m的系数c,然后再用c*(a^n)*(b^m), 这一步分理所当然需要快速幂,后来发现结果需要模10007,所以必不可少同余模定理。因为二项式定理,所以立刻想到了排列组合公式:
然后发现排列公式C不好进行同余模定理,所以我就换一种方法求二项式系数c,采用杨辉三角来递推c,以上就是本题的思想。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 10007;
int c[mod][mod];
LL q_pow(LL a, LL b){//快速幂
LL ans = 1;
while(b){
if(b & 1) ans = (ans * a)%mod;
a = (a*a) % mod;
b >>= 1;
}
return ans;
}
int main(){
LL a, b, k, n, m;
cin>>a>>b>>k>>n>>m;
a %= mod;
b %= mod;
if(m + n != k){
cout<<0<<endl;
}
else{
int key = min(n, m);
for(int i = 1; i <= k; i++){//杨辉三角
c[i][0] = 1;
c[i][i] = 1;
}
for(int i = 2; i <= k; i++){
for(int j = 1; j <= key && j <= i; j++){
c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod;
}
}
LL t1 = q_pow(a, n), t2 = q_pow(b, m);
t1 = (t1*t2)%mod;
LL ans = (c[k][key]*t1)%mod;
cout<<ans<<endl;
}
return 0;
}