母函数(Generating function)详解

— Tanky Woo

在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。

母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。

这里先给出两句话,不懂的可以等看完这篇文章再回过头来看:

1.“把组合问题的加法法则和幂级数的乘幂对应起来”

2.“母函数的思想很简单 — 就是把离散数列和幂级数一 一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造. “

我们首先来看下这个多项式乘法:

母函数图(1)

由此可以看出:

1.x的系数是a1,a2,…an 的单个组合的全体。

2. x^2的系数是a1,a2,…a2的两个组合的全体。

………

n. x^n的系数是a1,a2,….an的n个组合的全体(只有1个)。

进一步得到:

母函数图(2)

母函数的定义

对于序列a0,a1,a2,…构造一函数:

母函数图(3)

称函数G(x)是序列a0,a1,a2,…的母函数。

这里先给出2个例子,等会再结合题目分析:

第一种:

有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案?

考虑用母函数来解决这个问题:

我们假设x表示砝码,x的指数表示砝码的重量,这样:

1个1克的砝码可以用函数1+1*x^1表示,

1个2克的砝码可以用函数1+1*x^2表示,

1个3克的砝码可以用函数1+1*x^3表示,

1个4克的砝码可以用函数1+1*x^4表示,

上面这四个式子懂吗?

我们拿1+x^2来说,前面已经说过,x表示砝码,x的指数表示砝码的重量!初始状态时,这里就是一个质量为2的砝码。

那么前面的1表示什么?按照上面的理解,1其实应该写为:1*x^0,即1代表重量为2的砝码数量为0个。

所以这里1+1*x^2 = 1*x^0 + 1*x^2,即表示2克的砝码有两种状态,不取或取,不取则为1*x^0,取则为1*x^2

不知道大家理解没,我们这里结合前面那句话:

“把组合问题的加法法则和幂级数的乘幂对应起来“

接着讨论上面的1+x^2,这里x前面的系数有什么意义?

这里的系数表示状态数(方案数)

1+x^2,也就是1*x^0 + 1*x^2,也就是上面说的不取2克砝码,此时有1种状态;或者取2克砝码,此时也有1种状态。(分析!)

所以,前面说的那句话的意义大家可以理解了吧?

几种砝码的组合可以称重的情况,可以用以上几个函数的乘积表示:

(1+x)(1+x^2)(1+x^3)(1+x^4)

=(1+x+x^2+x^4)(1+x^3+^4+x^7)

=1 + x + x^2 + 2*x^3 + 2*x^4 + 2*x^5 + 2*x^6 + 2*x^7 + x^8 + x^9 + x^10

从上面的函数知道:可称出从1克到10克,系数便是方案数。(!!!经典!!!)

例如右端有2^x^5 项,即称出5克的方案有2种:5=3+2=4+1;同样,6=1+2+3=4+2;10=1+2+3+4。

故称出6克的方案数有2种,称出10克的方案数有1种 。


接着上面,接下来是第二种情况:

第二种:

求用1分、2分、3分的邮票贴出不同数值的方案数:

大家把这种情况和第一种比较有何区别?第一种每种是一个,而这里每种是无限的。

母函数图(4)

以展开后的x^4为例,其系数为4,即4拆分成1、2、3之和的拆分方案数为4;

即 :4=1+1+1+1=1+1+2=1+3=2+2

这里再引出两个概念"整数拆分"和"拆分数":

所谓整数拆分即把整数分解成若干整数的和(相当于把n个无区别的球放到n个无标志的盒子,盒子允许空,也允许放多于一个球)。

整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数。

现在以上面的第二种情况每种种类个数无限为例,给出模板:

#include <iostream>
using namespace std;
// Author: Tanky Woo
// www.wutianqi.com
const int _max = 10001;
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存没一次的情况
int c1[_max], c2[_max];
int main()
{   //int n,i,j,k;int nNum;   // int i, j, k;while(cin >> nNum){for(i=0; i<=nNum; ++i)   // ---- ①{c1[i] = 1;c2[i] = 0;}for(i=2; i<=nNum; ++i)   // ----- ②{for(j=0; j<=nNum; ++j)   // ----- ③for(k=0; k+j<=nNum; k+=i)  // ---- ④{c2[j+k] += c1[j];}for(j=0; j<=nNum; ++j)     // ---- ⑤{c1[j] = c2[j];c2[j] = 0;}}cout << c1[nNum] << endl;}return 0;
}

我们来解释下上面标志的各个地方:(***********!!!重点!!!***********)

①  、首先对c1初始化,由第一个表达式(1+x+x^2+..x^n)初始化,把质量从0到n的所有砝码都初始化为1.

②  、 i从2到n遍历,这里i就是指第i个表达式,上面给出的第二种母函数关系式里,每一个括号括起来的就是一个表达式。

③、j 从0到n遍历,这里j就是(前面i個表达式累乘的表达式)里第j个变量,(这里感谢一下seagg朋友给我指出的错误,大家可以看下留言处的讨论)。如(1+x)(1+x^2)(1+x^3),j先指示的是1和x的系数,i=2执行完之后变为

(1+x+x^2+x^3)(1+x^3),这时候j应该指示的是合并后的第一个括号的四个变量的系数。

④ 、 k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。

⑤  、把c2的值赋给c1,而把c2初始化为0,因为c2每次是从一个表达式中开始的。


咱们赶快趁热打铁,来几道题目:

(相应题目解析均在相应的代码里分析)

1.  题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028

代码:http://www.wutianqi.com/?p=587

这题大家看看简单不?把上面的模板理解了,这题就是小Case!

看看这题:

2.  题目:http://acm.hdu.edu.cn/showproblem.php?pid=1398

代码:http://www.wutianqi.com/?p=590

要说和前一题的区别,就只需要改2个地方。 在i遍历表达式时(可以参考我的资料—《母函数详解》),把i<=nNum改成了i*i<=nNum,其次在k遍历指数时把k+=i变成了k+=i*i; Ok,说来说去还是套模板~~~

3.  题目:http://acm.hdu.edu.cn/showproblem.php?pid=1085

代码:http://www.wutianqi.com/?p=592

这题终于变化了一点,但是万变不离其中。

大家好好分析下,结合代码就会懂了。

4.  题目:http://acm.hdu.edu.cn/showproblem.php?pid=1171

代码:http://www.wutianqi.com/?p=594

还有一些题目,大家有时间自己做做:

HDOJ:1709,1028、1709、1085、1171、1398、2069、2152

(原创文章,欢迎各位转载,但是请不要任意删除文章中链接,请自觉尊重文章版权,违法必究,谢谢合作。Tanky Woo原创, www.WuTianQi.com)

附:

1.在维基百科里讲到了普通母函數、指數母函數、L級數、貝爾級數和狄利克雷級數:

http://zh.wikipedia.org/zh-tw/%E6%AF%8D%E5%87%BD%E6%95%B0

2.Matrix67大牛那有篇文章:什么是生成函数:

http://www.matrix67.com/blog/archives/120

3.大家可以看看杭电的ACM课件的母函数那篇,我这里的图片以及一些内容都引至那。


如果大家有问题或者资料里的内容有错误,可以留言给出,博客: http://www.wutianqi.com/

Tanky Woo原创文章,转载请注明出处:http://www.wutianqi.com/?p=596。

对于任何转载本博客文章且不保留原文链接或任意删改文中链接的行为,本人将一定周旋到底!

老版下载地址:

母函数(Generating function)详解(点击下载)

(仅作保留所用,里面有错误,建议看我的最新版本,关注本博客:http://www.wutianqi.com/?p=539)

指数型母函数主要是关于排列组合方面的问题。

分别看两个比较典型的问题对比:

普通母函数问题:有红球两个,白球、黄球各一个,试求有多少种不同的组合方案。

指数型母函数问题:
假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次。从中取r个组合,求其组合数。

下面是指数型母函数的定义:

对于上面的问题“假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次。从中取r个组合,求其组合数。”:

母函数 By Tanky Woo相关推荐

  1. 博弈知识汇总----Tanky Woo(转)

    原文链接:http://www.wutianqi.com/?p=1081 以下是我从网上收集的关于组合博弈的资料汇总: 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个 人 ...

  2. gif动态图gif出处_我喜欢GIF的怪异事物

    gif动态图gif出处 I was recently reminded that I never wrote down all the weird things I learned about the ...

  3. HDU 2152 选课时间(题目已修改,注意读题) (母函数)

    选课时间(题目已修改,注意读题) Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. 母函数 入门 + 模板

    在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用母函数解决问题的方法称为母函数方法. 母函数可分为很多 ...

  5. dp 母函数 入门 + 模板

    dp 母函数 入门 + 模板 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用母函数解决问题的方法称为 ...

  6. 母函数——整数拆分(HDOJ2152)

    最近看到了一些关于母函数的题目,去网上找了一些材料,加上自己的理解,现在可以解决一些简单的问题.那么什么是母函数?其实这个问题我也没有怎么搞懂,通过几个例子来说明一下.下面是转载的一个介绍 http: ...

  7. 生成函数(母函数)入门详解

    感谢大佬! 感谢大佬 本文章从以上两位大佬的博客参考而来!再次感谢! 母函数,又称生成函数,是ACM竞赛中经常使用的一种解题算法,常用来解决组合方面的题目. 在数学中,某个序列的母函数(Generat ...

  8. 一道母函数的模板题 (hdu 2082)

    终于算弄明白母函数是什么东西了 = = , 呼~ 感觉它利用了高中学的二项式定理(就是用到组合数的那个) 完完全全的利用啊~~!以前用二项式求出最后那超长的x的表达式( 1 + C(n,1)*x^1 ...

  9. 网易游戏2011.10.15校园招聘会笔试题

    http://blog.csdn.net/hackbuteer1/article/details/6878570 1.对于一个内存地址是32位.内存页是8KB的系统.0X0005F123这个地址的页号 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:单隐含层神经网络公式推导及C++实现(二分类)
  2. npm安装bower时报错 我已解决
  3. c 中ajax不起作用,Jquery AJAX調用:$(this)在成功后不起作用
  4. python pil无法安装_解决virtualenv下安装Python PIL的support not available问题
  5. 软件开发模式对比(瀑布、迭代、螺旋、敏捷)
  6. 51nod-猴猴吃苹果【线段树】
  7. 迅雷的声音:摆脱视频产业的经济化困境
  8. 邮件服务 php,PHP基础-邮件服务
  9. java spi使用详解
  10. AutoFDO自动反馈式优化
  11. 教你制作自己的linux
  12. 逃离北上广:你以为回到小城市就很幸福了吗?
  13. python 豆瓣电影top250_Python数据可视化:豆瓣电影TOP250
  14. win7计算机不能设置双屏怎么回事,win7系统怎么设置双屏显示 win7电脑双屏显示功能使用方法...
  15. 入门级蓝牙遥控小车制作教程
  16. Excel中文本换行
  17. 申请ssl 验证域名 失败了 中间证书
  18. PAT (Advanced Level) Practis 1039 Course List for Student (25)
  19. eSIM时代,运营商的末日还是新生
  20. React生命周期介绍

热门文章

  1. ELK继续分析V2EX(我自己搬运我自己)
  2. 社交软件Soul撤回IPO申请:上市只差临门一脚 腾讯是大股东
  3. 设计模式原则 - 迪米特法则(六)
  4. 谁来给网络彩票排毒?
  5. 2021-3-30 hackbar
  6. ZZULIOJ 1148: 组合三位数之一
  7. Cognos集成至portal平台查看报表报错RSV-BBP-0022
  8. 京东商城(HTML和CSS实现京东商城网站)
  9. 门户、论坛、博客、SNS,网站模式的辨析
  10. 前端 - 博客系统(页面设计)