#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,整数拆分的理解的更多相关文章

  1. Ignatius and the Princess III HDU - 1028 || 整数拆分,母函数

    Ignatius and the Princess III HDU - 1028 整数划分问题 假的dp(复杂度不对) #include<cstdio> #include<cstri ...

  2. HDU 1028 整数拆分 HDU 2082 找单词 母函数

    生成函数(母函数) 母函数又称生成函数.定义是给出序列:a0,a1,a2,...ak,...an, 那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn  称为序 ...

  3. HDU 1028 整数拆分问题 Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  4. HDU 1028(数字拆分 分治)

    题意是求所给的数能够被拆分成的不同组合数目. 方法有三种: 一.完全背包. 限制条件:所用数字不大于 n. 目标:求分解种数(组合出 n 的方法数). 令 dp[ i ][ j ] = x 表示 用前 ...

  5. 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 ...

  6. HDU 1028 Ignatius and the Princess III(母函数整数拆分)

    链接:传送门 题意:一个数n有多少种拆分方法 思路:典型母函数在整数拆分上的应用 /********************************************************** ...

  7. 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 ...

  8. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0 ...

  9. hdu 1028 & hdu 1398 —— 整数划分(生成函数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分,每个数可以用无限次: 所以构造 f(x) = (1+x+x2+x3+...)(1+x2+x ...

随机推荐

  1. Ubuntu 16.04安装WPS

    1.下载 http://community.wps.cn/download/ 根据需要对应版本进行下载deb包. 2.安装 sudo dpkg -i wps-office_10.1.0.5672~a2 ...

  2. python_swift_project_middleware

    1. 写openstack swift的middleware 首先要确定swift用的是哪个middleware文件. 比如healthcheck这个中间件,在机器上有很多同名文件如下, 这两行可能是 ...

  3. ​网页图表Highcharts实践教程之标签组与加载动画

    ​网页图表Highcharts实践教程之标签组与加载动画 Highcharts标签组 在图表的大部分元素都提供了标签功能.但非常多时候,我们须要额外说明一些信息.这个时候借助原有的图表元素的标签功能就 ...

  4. LeetCode 389. Find the Difference (找到不同)

    Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...

  5. POJ 3468 A Simple Problem with Integers(线段树区间更新)

    题目地址:POJ 3468 打了个篮球回来果然神经有点冲动. . 无脑的狂交了8次WA..竟然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题. 区间更新就是加一个lazy标记,延迟标记, ...

  6. java中不能使用小数点(.)来作为分隔符

    split()括号里是一个String的参数,所以一定要符合这种:split(".")形式,即点'.'要用双引号""括起来"."在java中 ...

  7. linux替换目录下所有文件中的某字符串

    linux替换目录下所有文件中的某字符串 比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做: sed -i "s/zhangsan/lisi/g&quo ...

  8. 布局技巧2:合并布局(merge标签)

    我们已经有文章向你描述如何使用<include />标签来重用和共享你的布局代码.这篇文章将向你阐述<merge />标签的使用以及如何与<include />标签 ...

  9. 【转】ACM 2567 -- 树的Prufer编码

    本文介绍北京大学ACM网站2567号题目的解法.介绍部分基本翻译自网站上的题目介绍. 题目介绍:    给定一棵各节点编号为整数1,2,3...n的树(例如,无环连通图),其Prufer编码(Pruf ...

  10. 写web项目注意事项

    1.中文名2.文件存放路径(js css img)3.class详细路径(mydiv.myul li)