NOIP 2011 计算系数

题目描述

求 (ax+by)^k 的展开中 x^n*y^m 项的系数。由于系数可能很大,只要求输出除以 10007 的余数。

输入

一行共五个整数,分别为 a,b,k,n,m

输出

一个整数,为该项系数除以10007的余数。

样例输入

1 1 3 1 2

样例输出

3

数据范围:


30% 0<=k<=10,


50% a=1,b=1


100% 0<=k<=1000, 0<=n,m<=k 且 n+m=k, 0<=a,b<=100,000


//NOIP2011 DAY2 factor

Solution:

  首先先不考虑a,b的变化,即假设a=b=1。

  然后开始分析题意,(ax+by)^k的展开,在数学上是一个杨辉三角~

//下面是数学问题惹

   (假定a=b=1) 我们就k=0,1,2,3...进行分析

    1                x^0*y^0

    1 1           x^1+y^1

    1 2 1          x^2+2xy+y^2

    1 3 3 1       x^3+3x^2y+3xy^2+*y^2

    ......            ......

  以此类推,本题只是增加了a,b的数值。

  在杨辉三角中找出ans=f[k][m]后,再把ans^a后再ans^b即可。

  记得取模(不用写快速幂也是很良心der~)

 1 #include<cstdio>
 2 #define MAXN 1005
 3 #define MODE 10007
 4 using namespace std;
 5 int f[MAXN][MAXN];
 6 int a,b,k,n,m,ans=1;
 7 int main(){
 8     scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
 9     a%=MODE;b%=MODE;
10     for(int i=1;i<=k;i++) {
11         f[i][i]=f[i][0]=1;
12         f[i][1]=i;
13     }
14     for(int i=3;i<=k;i++)
15         for(int j=2;j<=i;j++) f[i][j]=(f[i-1][j-1]+f[i-1][j])%MODE;
16     ans=f[k][m]%MODE;
17     for(int i=1;i<=n;i++) ans=(ans*a)%MODE;
18     for(int i=1;i<=m;i++) ans=(ans*b)%MODE;
19     printf("%d",ans);
20     return 0;
21 }
原文地址:https://www.cnblogs.com/drizzly/p/7552318.html