【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)

简介: 计算系数  题目描述  给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数。  【数据范围】  对于 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。

 计算系数

 题目描述

 给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数。

 【数据范围】

 对于 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。

 输入格式

 共一行,包含 5 个整数,分别为a,b,k,n,m,每两个整数之间用一个空格隔开。

 输出格式

 输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取

 模后的结果。

 输入输出样例】
factor.in        factor.out
1 1 3 1 2        3

 

下面是某网友的代码:

来源:http://blog.sina.com.cn/s/blog_78aa51270100vqaz.html

#01: Accepted (0ms, 4184KB)
#02: Accepted (0ms, 4184KB)
#03: Accepted (0ms, 4184KB)
#04: Accepted (0ms, 4184KB)
#05: Accepted (0ms, 4184KB)
#06: Accepted (0ms, 4184KB)
#07: Accepted (0ms, 4184KB)
#08: Accepted (0ms, 4184KB)
#09: Accepted (0ms, 4184KB)
#10: Accepted (0ms, 4184KB)

Accepted / 100 / 0ms / 4184KB

解题报告:简单的递推而已。注意取模的位置就好了。不解释了。
 1 #include<stdio.h>
 2 #define rep(i,n) for(i=1;i<=n;i++)
 3 const int mo=10007;
 4 int a,b,k,n,m,i,j;
 5 int f[1010][1010];
 6 int main(){
 7     //freopen("factor.in","r",stdin);
 8     //freopen("factor.out","w",stdout);
 9     scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
10     a%=mo;b%=mo;f[0][0]=1;
11     rep(i,n) f[i][0]=(f[i-1][0]*a)%mo;
12     rep(i,m) f[0][i]=(f[0][i-1]*b)%mo;
13     rep(i,n) rep(j,m) f[i][j]=(f[i-1][j]*a + f[i][j-1]*b)%mo;
14     printf("%d\n",f[n][m]);
15     //system("pause");
16     //fclose(stdin);
17     //fclose(stdout);
18     return 0;
19 }
View Code

 

----------------------------------另一网友的分析--------------------------------------------------------

http://blog.sina.com.cn/s/blog_606a23dd010128lo.html

这道题虽然出现在提高组,却并不一定只能用高中知识解决。
其实,这道题可以用递推解决。【个人感觉下面这段分析描述不是很对。可以直接跳过到最后面的分析。】
设f[i][j]为(ax+by)^i的x^j*y^(n-j)的系数。显然可以得到公式:

   f[i][j]=(f[i-1][j-1]*a+f[i-1][j]*b)007。
时间复杂度O(N^2)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define mod 10007
 4 int a,b,n,m,k,i,j,f[1010][1010];
 5 int main()
 6 {
 7     scanf("%d %d %d %d %d",&a,&b,&k,&n,&m);
 8     a%=mod,b%=mod;
 9     f[1][0]=b,f[1][1]=a;
10     for(i=2;i<=k;i++)
11         for(j=0;j<=i&&j<=n;j++)
12         {
13             f[i][j]=f[i-1][j]*b%mod;
14             if(j)
15                 f[i][j]=(f[i][j]+f[i-1][j-1]*a)%mod;
16         }
17     printf("%d\n",f[k][n]);
18     return 0;
19 }
View Code

 

 
===================================================================================
下面是我自己的理解:
 
前面第一位的程序是对的,就是写代码的方式有些绕,而且分析少了一点。结合了第二位的分析,感觉第二位的分析描述没对。
假设f[i][j]表示(ax+by)^n的展开式中某一项x^i*y^j 的系数,其中i+j==n。
那么,x^i*y^j 可以由两种方案来递归构造:
(1).   x^i*y^j= x^(i-1)*y^j*x
(2).   x^i*y^j= x^i*y^(j-1)*y
把上面的x和y分别替换为ax和by,那就容易知道 f[i][j]=f[i-1][j]*a+f[i][j-1]*b
于是,我们可以构造一个二维数组f[][]来递推f[n][m]的值。递推的方法和上面第一个网友的代码一样。
第一个for是构造二维数组的第0列:
接着第二个for是构造二维数组的第0行:
接着用一个二重循环递推构造了整个二维数组,直至计算出f[n][m]的值。
最后即可直接输出f[n][m]。
 
还无法理解这个过程的可以自己用(ax+by)^2分析一下。
 
 
 1 #include<stdio.h>
 2 const int mo=10007;
 3 int a,b,k,n,m,i,j;
 4 int f[1010][1010];
 5 int main()
 6     {
 7     freopen("factor.in","r",stdin);
 8     freopen("factor.out","w",stdout);
 9     scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
10     a%=mo;b%=mo;f[0][0]=1;
11     for(i=1;i<=n;i++) f[i][0]=(f[i-1][0]*a)%mo;
12     for(i=1;i<=m;i++) f[0][i]=(f[0][i-1]*b)%mo;
13     for(i=1;i<=n;i++)
14     {
15         for(j=1;j<=m;j++)
16             f[i][j]=(f[i-1][j]*a + f[i][j-1]*b)%mo;
17     }  
18     printf("%d\n",f[n][m]);
19     return 0;
20 }
View Code

 

 
 
 
 
 
 
相关文章
|
算法 前端开发
前端算法-最大三角形面积-鞋带公式&-海伦公式
前端算法-最大三角形面积-鞋带公式&-海伦公式
16 0
|
3月前
|
Java C++ Python
计算n阶行列式
计算n阶行列式
38 0
|
6月前
|
算法
华为机试HJ70:矩阵乘法计算量估算
华为机试HJ70:矩阵乘法计算量估算
|
7月前
[NOIP2009]多项式输出
[NOIP2009]多项式输出
17:计算三角形面积
17:计算三角形面积
127 0
L1-048 矩阵A乘以B (15 分)
L1-048 矩阵A乘以B (15 分)
96 0
L1-048 矩阵A乘以B (15 分)
7-1 一元多项式求导 (10 分)
7-1 一元多项式求导 (10 分)
85 0
|
算法 Python
7-2 多项式求和 (10 分)
7-2 多项式求和 (10 分)
127 0
|
程序员 C语言 C++
L1-5 矩阵A乘以B (15 分)
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。
139 0
|
机器学习/深度学习
洛谷【4】P1035 [NOIP2002 普及组] 级数求和
洛谷【4】P1035 [NOIP2002 普及组] 级数求和
洛谷【4】P1035 [NOIP2002 普及组] 级数求和