【Noip2011】計算係數

【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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章