首页 > 代码库 > 计算系数(noip2011)

计算系数(noip2011)

【问题描述】
给定一个多项式(ax + by)^k,请求出多项式展开后(x^n)*(y^m)项的系数。
【输入】
输入文件名为 factor.in。
共一行,包含 5 个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。
【输出】
输出文件名为 factor.out。
输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。
【输入输出样例】

factor.in

factor.out

1 1 3 1 2

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。

分析:

首先弄懂样例,然后从简单数据入手找规律。

(a*x+b*y)^2=(a*x)^2+2*a*b*x*y+(b*y)^2

(a*x+b*y)^3=(a*x)^3+3*(a^2)*b*(x^2)*y+3*a*(b^2)*x*(y^2)+(b*y)^3

(a*x+b*y)^4=(a*x)^4+4*(a^3)*b*(x^3)*y+6*(a^2)*(b^2)*(x^2)*(y^2)+4*a*(b^3)*x*(y^3)+(b*y)^3 

(a*x+b*y)^5=......

通过这几个简单的公式可以得出(x^n)*(y^m)的系数为t*(a^n)*(b^m),t值如下所示:

1 2 1 

1 3 3 1

1 4 6 4 1

1 5 10 10 4 1

.........

这不就是杨辉三角么(当然也是所有的组合情况C(k,n))

若f[i,j]表示第i行第j列的系数(即(a^i)*(b^j)的系数),则有:

f[i,j]:=f[i-1,j-1]+f[i-1,j];

由于题目要求输出对10007 取模后的结果,则有:

f[i,j]:=((f[i-1,j-1] mod 10007)+(f[i-1,j]mod 10007))mod 10007;

a^n=((a^(N-1))mod 10007*a)mod 10007

b^m=((b^(m-1))mod 10007*b)mod 10007

则结果ans=f[i,j]*(a^n)*(b^m)