[NOIP2011提高组day2]-1-计算系数

1.计算系数 
(factor.cpp/c/pas) 
【问题描述】 
k n m
给定一个多项式(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


【数据范围】 
对于 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。

 

 

二项式系数:

是解决这道题的最直接方法;

很容易得出ans=a^n*b^m*c(k,m)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<map>
#include<set>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long 
using namespace std;
#define LL long long 
#define up(i,j,n) for(int i=(j);(i)<=(n);(i)++)
#define max(x,y) ((x)<(y)?(y):(x))
#define min(x,y) ((x)<(y)?(x):(y))
#define FILE "1"
const int maxn=1010,mod=10007;
int a,b,k,n,m;
int c[maxn][maxn];
namespace OI{
    void init(){scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);}
    int getc(int d){
        if(d>k-d)d=k-d;
        for(int i=1;i<=k;i++){
            c[i][0]=1;
            for(int j=1;j<=d&&j<=i;j++){
                if(!c[i][i-j])c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
                else c[i][j]=c[i][i-j];
            }
                
        }
        return c[k][d];
    }
    void slove(){
        init();
        a%=mod,b%=mod;
        LL ans=1;
        up(i,1,n)ans=ans*a%mod;
        up(i,1,m)ans=ans*b%mod;
        ans=ans*getc(m)%mod;
        cout<<ans<<endl;
    }
}

int main(){
    using namespace OI;
    slove();
}
View Code

 

posted @ 2016-10-08 19:15  CHADLZX  阅读(301)  评论(0编辑  收藏  举报