hdu,1028,整数拆分的理解
#include"iostream"
using namespace std;
int main()
{
int n,i,j,k;
int c[122],temp[122];
//c[] 数组用于储存当前多项式各项系数
//temp[]数组用于暂时储存在运算时的两多项式相加的系数和
while(cin>>n&&n!=0)
{
for(i=0;i<122;i++) //系数初始化,当前c[]所指的多项式是第一个多项式
{c[i]=1; temp[i]=0;}
for(i=2;i<=n;i++) //运算次数的控制
{
for(j=0;j<=n;j++)
for(k=0;k+j<=n;k+=i)
temp[k+j]+=c[j]; //系数相加
for(j=0;j<=n;j++) //新的多项式系数和temp[]初始化
{
c[j]=temp[j];
temp[j]=0;
}
}
cout<<c[n]<<endl;
}
return 0;
}
看了一下午加一晚上的母函数还有代码,原谅我笨,总于明白了一点,所以就和大家分享一下。
源问题是杭电ACM的1028题,大概意思是求 整数 n 的拆分数,大概算法思路有两种,一种是多项式乘法,一种是递推,我起先也是从递推考虑,后来才发现我找不到递推规律,因为它是一个二维数组递推,record[n-m][m]+record[n][m-1] (N>m)(原谅我找不到他的规律)所以就在多项式上着手
先给出公式(这是有好处的):G(n)=(1+x+x^2+....x^i)*(1+x^2+x^4+....x^i)(1+x^3...+x^i).....(1+x^i)( i 是指最接近 n且满足规律且小于等于n )
至于式子,自己理解,大概就是排列组合,这个还是百度一下 母函数 的基础概念比较好(宝宝是数学渣渣)
对于算法的实现:我们可以这样想G1*G2*G3*G4...Gi,可以先算出G1*G2,得到Gh,再让Gh*G3,所以要有一个大的循环控制运算次数
对于多项式的次数可以用数组下标表示,而系数用数组值表示,储存在c[]数组中,而与c[]相乘的多项式可以用第三次循环表示for(k=0;k+j<=n;k+=i){},temp[i]用于暂时存储相乘后次数为 i 的项的系数,k+j 就是表示两个多项式其中的各自的某一项相乘的次数。每次计算完成后可以由temp[]转给c[],temp[]清零后接着与下一个多项项相乘
对于多项式建议大家好好研究研究在排列组合和一些比较麻烦的问题上相当的重要,泰勒公式没学好,宝宝心里苦呀!数学很重要,真的!对于多项式和母函数之类的数学问题等我补好了缺口再与大家分享。
hdu,1028,整数拆分的理解的更多相关文章
- Ignatius and the Princess III HDU - 1028 || 整数拆分,母函数
Ignatius and the Princess III HDU - 1028 整数划分问题 假的dp(复杂度不对) #include<cstdio> #include<cstri ...
- HDU 1028 整数拆分 HDU 2082 找单词 母函数
生成函数(母函数) 母函数又称生成函数.定义是给出序列:a0,a1,a2,...ak,...an, 那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn 称为序 ...
- HDU 1028 整数拆分问题 Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU 1028(数字拆分 分治)
题意是求所给的数能够被拆分成的不同组合数目. 方法有三种: 一.完全背包. 限制条件:所用数字不大于 n. 目标:求分解种数(组合出 n 的方法数). 令 dp[ i ][ j ] = x 表示 用前 ...
- hdu 1028 整数划分 (母函数)
假如输入44 = 4;4 = 3 + 1;4 = 2 + 2;4 = 2 + 1 + 1;4 = 1 + 1 + 1 + 1;一共5种 假如输入3 用母函数的方法就是写成(1+X+X2+X3)(1+X ...
- HDU 1028 Ignatius and the Princess III(母函数整数拆分)
链接:传送门 题意:一个数n有多少种拆分方法 思路:典型母函数在整数拆分上的应用 /********************************************************** ...
- hdu acm 1028 数字拆分Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU 4651 Partition(整数拆分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){ f[0 ...
- hdu 1028 & hdu 1398 —— 整数划分(生成函数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分,每个数可以用无限次: 所以构造 f(x) = (1+x+x2+x3+...)(1+x2+x ...
随机推荐
- 安装elasticsearch遇到的签名和目标被配置多次的问题
命中:6 http://ppa.launchpad.net/ondrej/php/ubuntu bionic InRelease获取:7 http://packages.elastic.co/elas ...
- KonBoot – 只要5K映象文件轻易绕过您的WindowsXP/VISTA/7系统的密码
http://pannisec.diandian.com/?tag=konBoot 这个东西是我昨晚点击了QQ弹窗的那个SOSO问题后,有人问我如何破解Windows登陆密码,且不可以用net命令创建 ...
- shell apt install 按tab键自动补全
insert if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi to ~/.bashrc
- 【翻译自mos文章】OGG replicat 进程使用的 TCP port
OGG replicat 进程使用的 TCP port 来源于: TCP PORT USED BY REPLICAT PROCESSES (文档 ID 1060954.1) 适用于: Oracle G ...
- 【Android】资源系列(一) -- 国际化(多语言)
1.Android 中要实现国际化比較简单. 字符串国际化:仅仅要在 res 目录下新建相应语言的 values 目录就好了. 如.英语环境下的.目录命名为:values-en ...
- UVA 10555 - Dead Fraction(数论+无限循环小数)
UVA 10555 - Dead Fraction 题目链接 题意:给定一个循环小数,不确定循环节,求出该小数用分数表示,而且分母最小的情况 思路:推个小公式 一个小数0.aaaaabbb... 表示 ...
- unity3d-配置Android环境,打包发布Apk流程详解
31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...
- 为何Google这类巨头会认为敏捷开发原则是废话?
[编者按]这是一个来自Quora的问题.Rocket程序员Jasmine Adamson在文中表达了敏捷开发原则是废话的观点,他觉得现实生活中没有什么人会推崇这些原则来工作,不过他们仍然在说其所做的是 ...
- [算法基础]斐波那契(recursion+loop)两种方式执行时间对比
一.斐波那契数列求第n项两种方式 1.递归(自上而下)def recur_fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return ...
- http协议的MP4文件播放问题的分析
现在手上有两个链接 (1) http://202.108.16.173/cctv/video/8C/35/EB/E8/8C35EBE84E7B483C8741CF9A60154993/gphone/4 ...