作者:自为风月马前卒
链接:https://ac.nowcoder.com/discuss/179728
来源:牛客网

前言

第一次当标题党真是有点不适应

现在网上讲生成函数的教程大多都是从

开始,但是我不认为这样有助于大家理解生成函数的本质。我最开始学的时候也是在这里蒙了好久,直到看到了朱全民老师的课件,才真正的理解了生成函数的本质——处理排列组合问题的有利工具,而不是简单的
的指标代换。所以这篇文章,我打算从最基本的排列组合问题写起,最后慢慢扩展到
。内容会比较基础,高端玩家可以直接看鏼爷的集训队论文。

生成函数

定义

维基百科上是这么定义的:

的母函数(又称生成函数,英语:Generating function)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。

讲的通俗一点,对于某个序列

,我想找一个函数来表示它,假设是
。这时候函数第
项的

系数就表示了序列中的第

个元素。同时我们也可以看到,函数中的自变量
好像并没有什么意义,他的取值并不影响序列的表示,因此我们称这种函数为

形式幂级数

用处

那么这样定义由什么好处呢?

我们仔细观察一下

,不难发现这是一个多项式函数,对于多项式我们知道他有加、减、乘、 ~~除,求逆,取ln,exp~~ 等运算。那么我们对
进行乘法运算,也就是相当于对序列进行乘法运算,那么这样干有什么意义呢?我们不妨从一个题目入手。

普通生成函数

有三种物品,分别有3,2,3个,问拿出4个进行组合(

算一种)的方案数是多少

学过dp的人可能会一眼看出是背包板子题。直接设

表示当前到第
个位置,已经选了
个物品的方案数。转移的时候枚举一下当前选了几个
f

可以得到

的系数为
(从0开始编号),
最对应的一项是

那用生成函数怎么做呢?

我们可以对每个物品构造一个多项式函数,其中第

项的系数
表示选了
个当前物品的方案数。

那么第一个物品的生成函数为

(相同的物品选
个的方案数当然是1)

第二个物品的生成函数为

第三个为

先说结论:最终答案是

的第
项的系数

这是为什么呢?考虑两个多项式相乘的结果

,它的第
项的系数为
。这个过程是相当于是在枚举第一个物品选了几个,比如
这一项,他等于

再具体一点,抛开刚刚那个题目中系数等于

的限制,我们假设
,也就是说从第一个物品中选出
个有两种方案,第二个物品中选出
个有三种方案,那么
就相当于第一个物品的两种方案可以与第二个物品的三种方案任意组合来得到
种物品。(再看不懂的话建议去补一下高中组合计数qwq,这里讲的这么详细是为了给指数生成函数做铺垫)

这里建议大家去手玩一下多项式乘法,玩一下(玩的时候枚举

算他的系数)就会发现这个过程与背包的过程惊人的相似,因为事实上背包的过程就是在模拟多项式乘法。

这里为了下文(指数型生成函数)好讲解,本菜鸡直接把多项式相乘的结果写出来

其中

项可以由下面这些得到,这种形式与我们的手玩结果就非常相似了

形如

的表示一个序列的多项式函数,我们称之为

普通生成函数

讲到这里你需要大概明白:生成函数的基本概念,生成函数相乘的组合意义。

接下来按道理应该讲

及其运算,但是我想先介绍一下指数生成函数的基本概念。

指数生成函数

通过刚刚的讲解我们不难看出,普通生成函数的意义在于解决组合类计数问题。但是别忘了组合的兄弟排列呀。指数生成函数就是用来解决排列类问题。

还是刚刚的题目,我们改一下限制

有三种物品,分别有3,2,3个,问拿出4个进行组合(

算不同方案)的方案数是多少

这一类问题仅仅是比刚刚多了一个顺序的原因,但是难度却比刚刚大了不少(背包也可以做,只要在转移的时候乘一个组合数即可,留给大家思考)

这里先介绍一下多重集排列数

,其中第
表示第
个物品有
个。从中选出
个进行排列的方案数为
,解释的话就是相当于任意排列之后减去同种物品之间多出来的方案

这样我们就得到了一个思路:先把所有组合得到的方案算出来,然后再对每一种方案分别计算排列数,最后加起来。

比如我们刚刚已经得到了组合的方案:

其中

这一项的排列方案就是
这一项的排列方案就是
。观察一下,所有方案的分子都是
,分母都是选出来的对应数量的阶乘。

于是我们引进指数型生成函数

形如

的表示序列的多项式函数,我们称之为指数生成函数。

同时我们分别构造出

这时候再计算一下

这时候如何计算选出

个物品的答案呢?简单

可能大家不禁思考,为什么这么定义函数乘起来就是排列数呢?想一想,因为我们对每个系数构造的

就相当于是多重集排列数中的分母呀

好了,如果你到这里都看懂了的话,说明你已经对生成函数有个大概的了解了。但是不知道大家是不是和我有着同样的感觉:生成函数好麻烦啊qwq。

那么有没有一套可以简化些运算的理论呢?

答案是:当然有了!(不然我问个毛线)。下面讲的内容可以会有些刺激,需要大家有一定的数学基础(其实只要高中知识就行了)

普通生成函数的推广

简单介绍

这个也不能叫推广吧,是我自己瞎起的名字。。。

在我们刚刚的运算中出现了一个常用的函数

,这个东西怎么化简呢?

结论:

可能你和当初一次见到这个式子的我一样,大概是这个表情

我们来证明一下。

是不是证的天衣无缝但是又十分扯淡?因为这玩意儿显然只有

收敛也就是
时成立。其实在这里只要在
成立就可以了,因为生成函数是形式幂级数,我们并不关心
的具体取值

有了这个我们能干什么呢?我们可以对

变形来表示更多的序列,同时我们知道了
对应序列的第
项的系数为
,那么当我们知道了某一个序列的生成函数之后我们也可以把它变成类似于
的形式从而得到通项公式。

首先介绍一些简单的变换,建议大家手玩一下下面的生成函数的推广形式,比如把"乘

"换成"乘
"

替换为

替换为

替换为
,

将分子乘

,

将分子乘

,

求个导,

再求一次,

问题来了,我如果知道了某一个数列的生成函数,怎么求它的通项公式呢?一般的思路就通过各种奇技淫巧往上面的几个生成函数转化。这里要提一下比较常用的**广义二项式定理**

我们来通过两个例子来具体讲一下它的用处

求斐波那契数列通项公式

非常不不要脸的抄一下自己以前的博客

首先要知道斐波那契数列的递推式

那么推导一下

根据递推式,我们可以这样变化,显然有

那么可以得到一个方程

整理一下

这样我们就得到了斐波那契数列的生成函数,然而并没有什么卵用,因为我们不能直接通过观察看出每一项的系数。

现在考虑一下,我们接下来可以干什么。我们已经知道了

所表示的序列。接下来要干的当然是把
往上面的两个式子转化。
这玩意儿下半部分是个一元二次方程,我们可以配方

(解的时候可以直接把后面的式子拆开,把这两个式子对应项联立组成方程组,

的取值是可以反过来的)

这个时候我们发现已经找到与

的联系了,我们可以把
拆成求和的形式。可以裂一下项

原式变为

,然后再解一个方程

解这个方程就没那么休闲了,这里我们选择把

当做主元对方程进行变换

这样就好处理了,只要列个二元一次方程组

解一下可以得到

带回去

那么第

项的公式为

解决组合类问题

比如这种休闲板子题

至多为

就是

这个东西可以直接广义二项式定理展开,然后交一发pypy2就过了。。

指数生成函数的推广

和上面的很类似,这里直接说结论

证明:考虑直接将

处泰勒展开 由泰勒展开的公式
的意思是求
次导数)

一些常用变换:

一道简单的题目

长度为

的序列,用红黄蓝绿四种颜色染色,其中红黄只能是偶数,问方案数

这道题就比较休闲了

任意的是

,偶数的是

最后化完是

(
)相当于常数项

直接快速幂就可以求

后记

本篇讲的是关于生成函数最基础的内容,千万不要认为自己看懂了上面的内容就生成函数了,充其量也就是了解而已。生成函数理论十分博大精深,我也只是略知皮毛。过几天可能会根据学习情况更一些生成函数与多项式运算的东西,敬请期待吧qwq

参考资料

生成函数-罗煜楚(版权原因暂不公开)

组合数学—母函数与递推——朱全民

母函数——维基百科

与作者交流:https://ac.nowcoder.com/discuss/179728

更多算法和题解:https://ac.nowcoder.com/acm/contest/discuss

nxn次方求和函数_算法|小学生都能看懂的生成函数入门教程相关推荐

  1. 《小学生都能看懂的生成函数从入门到升天教程》《生成函数全家桶》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列 目录 0x00 生成函数 0x10 例题引入 0x11 ExampleA\tt E ...

  2. nxn次方求和函数_数学思维之旅-从等差数列到黎曼函数

    高中的时候,我们从课本上可以得知等差数列的求和公式,也震惊于少年高斯的精彩故事,也就是 ,在高中数学课本选修2-2的微积分定义的时候曾经引用求和公式 ,至此,我们将走向一段神奇的旅程,这里 不涉及严格 ...

  3. nxn次方求和函数_生成函数(母函数)详解 - Jijidawang

    0. 前置 1. 广义二项式定理(牛顿二项式定理) 我们重新定义组合数: \[\dbinom rk=\dfrac{r^{\underline{k}}}{k!} \] 其中 \(r^{\underlin ...

  4. 《小学生都能看懂的三类斯特林数从入门到升天教程 》(含性质完整证明、斯特林反演、拉赫数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 真的特别简单,我尽量讲的详细一些,本文包含了几乎所有性质定理证明,老少皆宜 ~ 内容过多,质量过硬,建 ...

  5. 小学生都能看懂的FFT!!!

    小学生都能看懂的FFT!!! 前言 在创新实践中心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...

  6. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  7. 《小学生都能看懂的群论从入门到升天教程》 《群论全家桶》

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列,小学生:我太难了   群论.置换.Bunrnside引理.Pόlya定理等概念是群 ...

  8. 小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题

    小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题 原创 韦东山 百问科技 1周前 上周四我们预告了这周要发布环境搭建的终极解决方案,经过一周的努力,终于写好了文档,Ubunt ...

  9. 一篇高中生都能看懂的MySQL入门博客(长文)

    写在前面: 本篇博客共一万五千字左右,是我自己对MySQL进行重新学习时写的,是一些偏基础的东西. 如果你对MySQL足够的了解,本篇博客最多只能起一个查漏补缺的作用. 博客的主要面向对象为:想学习了 ...

最新文章

  1. 高斯判别分析 Gaussian Discriminant Analysis
  2. 真正理解、区分Action,Service和Dao功能
  3. MySQL之终端(转载笔记)
  4. 使用经过oauth验证后的github API,避免调用频次超标的问题
  5. PC寄存器为什么会被设定为线程私有
  6. Registered Nurse in the US
  7. 合并果子(洛谷-P1090)
  8. hadoop linux 集群提交任务
  9. Jquery向页面append新元素之后,如何解决事件的绑定问题?
  10. Day04_绘制矩形
  11. sprint() 和 snprint()
  12. Centos7安装iNode客户端
  13. MySQL InnoDB Cluster部署方案与实践
  14. Java常用类,这一次帮你总结好!
  15. 解构给默认值_函数的对象参数的解构和默认值
  16. c语言对随机数进行快速排序,C语言自带快速排序对比插入排序
  17. 《完全用Linux工作》
  18. 机器学习笔记丨神经网络的反向传播原理及过程(图文并茂+浅显易懂)
  19. java集合入门和深入学习
  20. html5移动端轮播图特效,支持移动端的纯js轮播图插件awesome-slider

热门文章

  1. mysql问题系列(一)-----No space left on device
  2. Lattice并购案我国FPGA发展路径
  3. turtle库使用——漫天繁星+万花筒绘制
  4. 网络编程 —— 基础理论知识
  5. 示波器界面的中英文切换
  6. PROCAST-重力铸造分析流程
  7. 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
  8. wordpress 安全保密hacks
  9. 刷新页面,js实现文章浏览量自动更新
  10. 华科_图形学笔记_05_初探造型技术_02