【Noip2011】計算係數
描述:
給定一個多項式(ax + by)^k,請求出多項式展開後x^n * y^m項的係數。
輸入:
共一行,包含5個整數,分別爲a,b,k,n,m,每兩個整數之間用一個空格隔開。
輸出:
輸出共1行,包含一個整數,表示所求的係數,這個係數可能很大,輸出對10007取模後的結果。
題解:
可以簡單推一推a=1,b=1時各項按x冪級降序排列時的係數規律爲楊輝三角。再加上a、b係數推一推,發現第i項係數=楊輝三角對應位數字*b的(m-1)次冪*a的(k-n+1)次冪。這題窩用了滾動數組節省內存,快速冪優化時間。輸出直接printf數組第m-1項就ok啦。
#include<iostream>
#include<cstdio>
using namespace std;
int a,b,k,n,m;
long long la[2][10000010];
const int mod=10007;
long long pow(long long a,int b){
int t,y;
t=1;
y=a;
while(b!=0){
if(b&1==1) t=t*y%mod;
y=y*y%mod;
b=b>>1;
}
return t;
}
int main(){
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
int cnt=0;
a%=mod;
b%=mod;
la[cnt][1]=1;
la[cnt][2]=1;
int len;
for(register int i=1;i<=k;++i){
len=1;
while(la[cnt][len]!=0){
la[cnt^1][len]=(la[cnt][len-1]+la[cnt][len])%mod;
len++;
}
la[cnt^1][len]=1;
cnt^=1;
}
cnt^=1;
for(int i=0;i<len-1;i++){
la[cnt][i+1]*=pow(b,i)%mod;
la[cnt][i+1]%=mod;
la[cnt][i+1]*=pow(a,k-i)%mod;
la[cnt][i+1]%=mod;
}
printf("%lld",la[cnt][m+1]);
return 0;
}