【问题描述】
给定一个多项式(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 5 1
.........
这不就是杨辉三角么(当然也是所有的组合情况C(k,n))
若f[i,j]表示(a*x+b*y)^i展开后的系数
(a^n)*(b^m)的系数为f[i,i-n+1]
又
f[i,j]:=f[i-1,j-1]+f[i-1,j];
结果:ans=f[k,k-n+1]*(a^n)*(b^m)
由于题目要求输出对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
(a^n可以边乘边取余数的方法做,也可用快速幂)。
注意:边界条件k=0,k=n等。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const 2 maxk=1100; 3 var 4 a,b,k,n,m,i,j,ans:longint; 5 f:array[0..maxk,0..maxk] of longint; 6 begin 7 readln(a,b,k,n,m); 8 fillchar(f,sizeof(f),0); 9 f[1,1]:=1; f[1,2]:=1; 10 for i:=1 to k do begin f[i,1]:=1; f[i,i+1]:=1; end; 11 for i:=1 to k do 12 for j:=2 to i do 13 f[i,j]:=(f[i-1,j-1]+f[i-1,j] ) mod 10007; 14 ans:=1; 15 for i:=1 to n do ans:=(ans *a) mod 10007; 16 for i:=1 to m do ans :=(ans *b)mod 10007; 17 ans:=(f[k,k-n+1]*ans) mod 10007; 18 if k=0 then writeln(1) else writeln(ans); 19 end.