计算系数

题目描述

给定一个多项式(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

解题报告:简单的递推而已。注意取模的位置就好了。不解释了。
 #include<stdio.h>
#define rep(i,n) for(i=1;i<=n;i++)
const int mo=;
int a,b,k,n,m,i,j;
int f[][];
int main(){
//freopen("factor.in","r",stdin);
//freopen("factor.out","w",stdout);
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
a%=mo;b%=mo;f[][]=;
rep(i,n) f[i][]=(f[i-][]*a)%mo;
rep(i,m) f[][i]=(f[][i-]*b)%mo;
rep(i,n) rep(j,m) f[i][j]=(f[i-][j]*a + f[i][j-]*b)%mo;
printf("%d\n",f[n][m]);
//system("pause");
//fclose(stdin);
//fclose(stdout);
return ;
}

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

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)

 #include<stdio.h>
#include<stdlib.h>
#define mod 10007
int a,b,n,m,k,i,j,f[][];
int main()
{
scanf("%d %d %d %d %d",&a,&b,&k,&n,&m);
a%=mod,b%=mod;
f[][]=b,f[][]=a;
for(i=;i<=k;i++)
for(j=;j<=i&&j<=n;j++)
{
f[i][j]=f[i-][j]*b%mod;
if(j)
f[i][j]=(f[i][j]+f[i-][j-]*a)%mod;
}
printf("%d\n",f[k][n]);
return ;
}
 
===================================================================================
下面是我自己的理解:
 
前面第一位的程序是对的,就是写代码的方式有些绕,而且分析少了一点。结合了第二位的分析,感觉第二位的分析描述没对。
假设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分析一下。
 

 #include<stdio.h>
const int mo=;
int a,b,k,n,m,i,j;
int f[][];
int main()
{
freopen("factor.in","r",stdin);
freopen("factor.out","w",stdout);
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
a%=mo;b%=mo;f[][]=;
for(i=;i<=n;i++) f[i][]=(f[i-][]*a)%mo;
for(i=;i<=m;i++) f[][i]=(f[][i-]*b)%mo;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
f[i][j]=(f[i-][j]*a + f[i][j-]*b)%mo;
}
printf("%d\n",f[n][m]);
return ;
}
 
 
 
 
 
 

【转】TYVJ 1695 计算系数(NOIP2011 TG DAY2 1)的更多相关文章

  1. 计算系数(noip2011)

    [问题描述]给定一个多项式(ax + by)^k,请求出多项式展开后(x^n)*(y^m)项的系数.[输入]输入文件名为 factor.in.共一行,包含 5 个整数,分别为a,b,k,n,m,每两个 ...

  2. 计算系数(NOIP2011提高LuoguP1313)

    一道数论好题,知识点涉及扩展欧几里得,快速幂,逆元,二项式定理,模运算,组合数等. (别问为啥打了快速幂不用费马小求逆元...我就练习下扩欧) (数据就应该再加大些卡掉n^2递推求组合数的) #inc ...

  3. NOIP2011 day2 第一题 计算系数

    计算系数 NOIP2011 day2 第一题 描述 给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m项的系数. 输入格式 共一行,包含5 个整数,分别为 a ,b ,k ,n ,m, ...

  4. 洛谷P1313 [NOIP2011提高组Day2T1]计算系数

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

  5. 一本通1648【例 1】「NOIP2011」计算系数

    1648: [例 1]「NOIP2011」计算系数 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 给定一个多项式 (ax+by)k ,请求出多项式展开后 x ...

  6. 题解 【NOIP2011】计算系数

    [NOIP2011]计算系数 Description 给定一个多项式 (ax+by)^k ,请求出多项式展开后 x^n * y^m 项的系数. Input 共一行,包含 5 个整数,分别为 a,b,k ...

  7. NOIP2011 计算系数

    1计算系数 给定一个多项式 (ax + by)k ,请求出多项式展开后 x n y m 项的系数. [输入] 输入文件名为 factor.in. 共一行,包含 5 个整数,分别为 a,b,k,n,m, ...

  8. luoguP1313 计算系数 题解(NOIP2011)

    P1313 计算系数 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...

  9. 【NOIP2011提高组】计算系数

    计算系数 算法:真·滚动数组模拟!!! 马上CSP/S了,这是远在今年暑假前的一天的校内考试题中的一道.当时做的时候不会组合数,不会二项式定理,不会DP,不会……只知道应该n*n的空间存一个杨辉三角形 ...

随机推荐

  1. Android Launcher 详解

    (1)      Launcher的定义:Android系统启动后,加载的第一个程序,是其他应用程序的入口. (2)      Launcher的构成:HomeScreen(1.workspace(A ...

  2. HDU 4396

    http://acm.hdu.edu.cn/showproblem.php?pid=4396 题意:在至少走k条边的前提下求最短路 思路:在原有最短路模板的基础上多加一维,dis[i][j]表示走到i ...

  3. LeetCode Maximum Subarray (最大子段和)

    题意: 给一个序列,求至少含一个元素的最大子段和? 思路: 跟求普通的最大子段和差不多,只不过需要注意一下顺序.由于至少需要一个元素,所以先将ans=nums[0].接下来可以用sum求和了,如果小于 ...

  4. php求文件的相对路径

    php转义字符的应用,\为转义字符需要转义为\\. <?php //求b相对a的路径 $a="d:\web\file\ab.php"; $b="d:\web\fil ...

  5. val() 和attr() 取值的问题

  6. <area> 标签

    定义和用法 <area> 标签定义图像映射中的区域(注:图像映射指得是带有可点击区域的图像). area 元素总是嵌套在 <map> 标签中. 注释:<img> 标 ...

  7. js获取非行内样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 设计模式:Strategy 策略模式 -- 行为型

    设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...

  9. Sed 直接修改文件

    sed最常用的用法莫过于替换文件,然而其默认的模式是直接输出在shell中 sed 's/Old/New/' My_File.txt 如果我们想要sed直接在文件中更改,只需要在sed后面添加 -i ...

  10. Cocos2d-x游戏移植到Android平台

    1.所需环境支持:Android SDK.NDK.Eclipse.Cygwin.(本人所用系统WIN7-64位) (1)Cygwin的下载安装: Cygwin是Windows下的Linux模拟环境,用 ...