【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;
}