首页 > 代码库 > 计算系数(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)