nxn次方求和函数_算法|小学生都能看懂的生成函数入门教程
作者:自为风月马前卒
链接:https://ac.nowcoder.com/discuss/179728
来源:牛客网
前言
第一次当标题党真是有点不适应
现在网上讲生成函数的教程大多都是从
生成函数
定义
维基百科上是这么定义的:
的母函数(又称生成函数,英语:Generating function)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。
讲的通俗一点,对于某个序列
系数就表示了序列中的第
形式幂级数。
用处
那么这样定义由什么好处呢?
我们仔细观察一下
普通生成函数
有三种物品,分别有3,2,3个,问拿出4个进行组合(
算一种)的方案数是多少
学过dp的人可能会一眼看出是背包板子题。直接设
f
可以得到
那用生成函数怎么做呢?
我们可以对每个物品构造一个多项式函数,其中第
那么第一个物品的生成函数为
第二个物品的生成函数为
第三个为
先说结论:最终答案是
这是为什么呢?考虑两个多项式相乘的结果
再具体一点,抛开刚刚那个题目中系数等于
这里建议大家去手玩一下多项式乘法,玩一下(玩的时候枚举
这里为了下文(指数型生成函数)好讲解,本菜鸡直接把多项式相乘的结果写出来
其中
形如
普通生成函数
讲到这里你需要大概明白:生成函数的基本概念,生成函数相乘的组合意义。
接下来按道理应该讲
指数生成函数
通过刚刚的讲解我们不难看出,普通生成函数的意义在于解决组合类计数问题。但是别忘了组合的兄弟排列呀。指数生成函数就是用来解决排列类问题。
还是刚刚的题目,我们改一下限制
有三种物品,分别有3,2,3个,问拿出4个进行组合(
算不同方案)的方案数是多少
这一类问题仅仅是比刚刚多了一个顺序的原因,但是难度却比刚刚大了不少(背包也可以做,只要在转移的时候乘一个组合数即可,留给大家思考)
这里先介绍一下多重集排列数
设
,其中第表示第个物品有个。从中选出个进行排列的方案数为,解释的话就是相当于任意排列之后减去同种物品之间多出来的方案
这样我们就得到了一个思路:先把所有组合得到的方案算出来,然后再对每一种方案分别计算排列数,最后加起来。
比如我们刚刚已经得到了组合的方案:
其中
于是我们引进指数型生成函数
形如
同时我们分别构造出
这时候再计算一下
这时候如何计算选出
可能大家不禁思考,为什么这么定义函数乘起来就是排列数呢?想一想,因为我们对每个系数构造的
好了,如果你到这里都看懂了的话,说明你已经对生成函数有个大概的了解了。但是不知道大家是不是和我有着同样的感觉:生成函数好麻烦啊qwq。
那么有没有一套可以简化些运算的理论呢?
答案是:当然有了!(不然我问个毛线)。下面讲的内容可以会有些刺激,需要大家有一定的数学基础(其实只要高中知识就行了)
普通生成函数的推广
简单介绍
这个也不能叫推广吧,是我自己瞎起的名字。。。
在我们刚刚的运算中出现了一个常用的函数
结论:
可能你和当初一次见到这个式子的我一样,大概是这个表情
我们来证明一下。
是不是证的天衣无缝但是又十分扯淡?因为这玩意儿显然只有
有了这个我们能干什么呢?我们可以对
首先介绍一些简单的变换,建议大家手玩一下下面的生成函数的推广形式,比如把"乘
将
将
将
将分子乘
将分子乘
求个导,
再求一次,
问题来了,我如果知道了某一个数列的生成函数,怎么求它的通项公式呢?一般的思路就通过各种奇技淫巧往上面的几个生成函数转化。这里要提一下比较常用的**广义二项式定理**
我们来通过两个例子来具体讲一下它的用处
求斐波那契数列通项公式
非常不不要脸的抄一下自己以前的博客
首先要知道斐波那契数列的递推式
那么推导一下
设
根据递推式,我们可以这样变化,显然有
那么可以得到一个方程
整理一下
这样我们就得到了斐波那契数列的生成函数,然而并没有什么卵用,因为我们不能直接通过观察看出每一项的系数。
现在考虑一下,我们接下来可以干什么。我们已经知道了
(解的时候可以直接把后面的式子拆开,把这两个式子对应项联立组成方程组,
这个时候我们发现已经找到与
原式变为
解这个方程就没那么休闲了,这里我们选择把
这样就好处理了,只要列个二元一次方程组
解一下可以得到
带回去
那么第
解决组合类问题
比如这种休闲板子题
至多为
这个东西可以直接广义二项式定理展开,然后交一发pypy2就过了。。
指数生成函数的推广
和上面的很类似,这里直接说结论
证明:考虑直接将
一些常用变换:
一道简单的题目
长度为
的序列,用红黄蓝绿四种颜色染色,其中红黄只能是偶数,问方案数
这道题就比较休闲了
任意的是
最后化完是
直接快速幂就可以求
后记
本篇讲的是关于生成函数最基础的内容,千万不要认为自己看懂了上面的内容就会生成函数了,充其量也就是了解而已。生成函数理论十分博大精深,我也只是略知皮毛。过几天可能会根据学习情况更一些生成函数与多项式运算的东西,敬请期待吧qwq
参考资料
生成函数-罗煜楚(版权原因暂不公开)
组合数学—母函数与递推——朱全民
母函数——维基百科
与作者交流:https://ac.nowcoder.com/discuss/179728
更多算法和题解:https://ac.nowcoder.com/acm/contest/discuss
nxn次方求和函数_算法|小学生都能看懂的生成函数入门教程相关推荐
- 《小学生都能看懂的生成函数从入门到升天教程》《生成函数全家桶》
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列 目录 0x00 生成函数 0x10 例题引入 0x11 ExampleA\tt E ...
- nxn次方求和函数_数学思维之旅-从等差数列到黎曼函数
高中的时候,我们从课本上可以得知等差数列的求和公式,也震惊于少年高斯的精彩故事,也就是 ,在高中数学课本选修2-2的微积分定义的时候曾经引用求和公式 ,至此,我们将走向一段神奇的旅程,这里 不涉及严格 ...
- nxn次方求和函数_生成函数(母函数)详解 - Jijidawang
0. 前置 1. 广义二项式定理(牛顿二项式定理) 我们重新定义组合数: \[\dbinom rk=\dfrac{r^{\underline{k}}}{k!} \] 其中 \(r^{\underlin ...
- 《小学生都能看懂的三类斯特林数从入门到升天教程 》(含性质完整证明、斯特林反演、拉赫数)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 真的特别简单,我尽量讲的详细一些,本文包含了几乎所有性质定理证明,老少皆宜 ~ 内容过多,质量过硬,建 ...
- 小学生都能看懂的FFT!!!
小学生都能看懂的FFT!!! 前言 在创新实践中心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...
- 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...
- 《小学生都能看懂的群论从入门到升天教程》 《群论全家桶》
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 小学生都能看懂系列,小学生:我太难了 群论.置换.Bunrnside引理.Pόlya定理等概念是群 ...
- 小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题
小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题 原创 韦东山 百问科技 1周前 上周四我们预告了这周要发布环境搭建的终极解决方案,经过一周的努力,终于写好了文档,Ubunt ...
- 一篇高中生都能看懂的MySQL入门博客(长文)
写在前面: 本篇博客共一万五千字左右,是我自己对MySQL进行重新学习时写的,是一些偏基础的东西. 如果你对MySQL足够的了解,本篇博客最多只能起一个查漏补缺的作用. 博客的主要面向对象为:想学习了 ...
最新文章
- 高斯判别分析 Gaussian Discriminant Analysis
- 真正理解、区分Action,Service和Dao功能
- MySQL之终端(转载笔记)
- 使用经过oauth验证后的github API,避免调用频次超标的问题
- PC寄存器为什么会被设定为线程私有
- Registered Nurse in the US
- 合并果子(洛谷-P1090)
- hadoop linux 集群提交任务
- Jquery向页面append新元素之后,如何解决事件的绑定问题?
- Day04_绘制矩形
- sprint() 和 snprint()
- Centos7安装iNode客户端
- MySQL InnoDB Cluster部署方案与实践
- Java常用类,这一次帮你总结好!
- 解构给默认值_函数的对象参数的解构和默认值
- c语言对随机数进行快速排序,C语言自带快速排序对比插入排序
- 《完全用Linux工作》
- 机器学习笔记丨神经网络的反向传播原理及过程(图文并茂+浅显易懂)
- java集合入门和深入学习
- html5移动端轮播图特效,支持移动端的纯js轮播图插件awesome-slider