#NOIP2011#计算系数

【NOIP2011】计算系数

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给定一个多项式(ax + by)^k,请求出多项式展开后x^n y^m项的系数。

输入

输入文件名为 factor.in。
共一行,包含 5 个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。

输出

输出文件名为 factor.out。
输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取
模后的结果。

样例输入

factor.in 
1 1 3 1 2

样例输出

factor.out
3

提示

【数据范围】

对于 30%的数据,有0≤k≤10;

对于 50%的数据,有a = 1,b = 1;

对于 100%的数据,有0≤k≤1,000,0≤n, m≤k,且n + m = k,0≤a,b≤1,000,000。

本来只是求一个组合数C(k , n)或者C(k , m)然后乘上a,b对应的幂的,但是做题的时候发现怎么都WA,,然后翻看了好久以前做对的代码才发现,这个题的ax,by

其实是倒过来的,也就是变成了(by+ax)^k,比如输入是(x + 2*y)^2,本来展开应该是x^2 + 4*xy + 4*y^2,但是由于倒过来,就变成了4*y^2 + 4*xy + x^2,也就是要把n,m

反过来。

#include
#include
#include
using namespace std;
const int mod=10007;
int C[1010][1010];
int main(){
    int a,b,k,n,m;
    scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
    a%=mod,b%=mod;
    C[1][0]=b,C[1][1]=a;
    for(int i=2; i<=k; ++i)
        for(int j=0; j<=i && j<=n; ++j){
            C[i][j]=C[i-1][j]*b%mod;
            if(j)
                C[i][j]=(C[i][j]+C[i-1][j-1]*a)%mod;
        }
    printf("%d\n",C[k][n]);
}







你可能感兴趣的:(NOIP,math,组合数学)