趣谈生成函数 =v=
趣谈生成函数 =v=
今天luyouqi在洛谷随机跳题rand出来一道生成函数板子题,然后我给做了(雾
发现小伙伴们还不会生成函数,于是我试着写这篇生成函数简介。(其实我也不怎么会生成函数这么高级的东西,本篇纯属道听途说,大家看着当故事娱乐一下就好)
食用指南
- 笔和草算纸是推荐的食用工具
从前有一个无限长的随便一个数列\(a = \{2, 1, 4, 7, 4\}\),有一天,一个大佬说:能不能用一个函数表示这个数列呢?于是大佬把\(a\)的每一项当做一个多项式的系数,得到了多项式函数\(f(x) = 2 + x + 4x^2 + 7x^3 + 4x^4\),用来表示上面那个序列。大佬很开心。
大佬的朋友——蒟蒻感到疑惑:这个函数代入一个\(x\),得到的东西有什么意义啊?
大佬思考了一会,说:也没什么意义。
蒟蒻说:那你研究它有个*儿用?
大佬又思考了一会,找到了它的一种用途。假如数列\(a\)代表一类物品,中\(a_i\)表示这类物品中选\(i\)件物品的方案数——例如\(a = \{1, 1, 1\}\)表示A类物品中可以选0件或1件或2件,但不能选大于2件;又例如无限长数列\(b = \{1, 0, 0, 1, 0, 0, 1, 0, 0, 1...\}\)表示B类物品只能选3的倍数件。这时候,把\(f(x) = 1 + x + x^2\)和\(g(x) = 1 + x^3 + x^6 + x^9 ...\)乘起来,得到另一个函数\(h(x) = 1 + x + x^2 + x^3 + x^4 + ...\)。这个函数有什么意义呢?它的第\(i\)项的系数就是选A、B两种物品共\(i\)件的方案数。
蒟蒻说:这有啥,不就是把两个多项式乘起来么?和\(O(n^2)\)一个个枚举有什么区别?
大佬说:嗯……你可以FFT……
蒟蒻:哦。没有这个函数我也知道可以FFT。
大佬不认为这个“用函数表示数列”的东西很没用,他决定继续研究,还给它取了个名字叫做数列的“生成函数”,表示用这个函数能生成(表示)一个数列。
有一天,大佬告诉蒟蒻他发现了一个规律——\(a = \{1, 1, 1, 1, 1...\}\)的生成函数是\(f(x) = \frac{1}{1 - x}\)
蒟蒻说:老哥,您不会是研究数学研究傻了吧?它的生成函数不是\(1 + x + x^2 + x^3...\)嘛?怎么会等于您这个\(\frac{1}{1 - x}\)呢?
大佬说:对啊!\(1 + x + x^2 + x^3...\)就等于\(\frac{1}{1 - x}\)!
蒟蒻:喂,大连市第七人民医院嘛?
大佬:……在\(x\in (-1, 1)\)的时候。
蒟蒻:你不早说!等等,为什么\(x\in (-1, 1)\)时就相等了?
大佬:等比数列求和公式啊,\(1 + x + x^2 + x^3...\)的前\(n\)项和等于\(\frac{1 - x^n}{1 - x}\),这是个无限长的数列,\(n\)趋近于无穷的时候\(x^n\)趋近于0,这不就相等了嘛!
蒟蒻:啊,对啊!可是好好的一个函数,你凭空给限定了定义域,这还是原来那个函数嘛?
大佬:不是你说的生成函数中的\(x\)没有意义嘛!还有,你看\(1 + x^2 + x^4 + x^6...\)这个函数,它是不是等于\(\frac{1}{1-x^2}\)?
蒟蒻:对,把前一个式子中的\(x\)换成\(x^2\)不就好了嘛!可是\(1 + 2x + 3x^2 + 4x^3...\)这个函数,它等于什么?
大佬:等于\(\frac{1}{(1 - x)^2}\)啊!你看,对等式\(\frac{1}{1 - x} = 1 + x + x^2 + x^3...\)两边分别求导,得到……算了,说了你也不懂,那你把两个\(1 + x + x^2 + x^3...\)乘起来不就好了嘛!
蒟蒻:蛤?我看看……的确诶!
大佬:我还知道\(1 + 3x + 6x^2 + 10x^3 + 15x^4...\)的生成函数是多少呢!是\(\frac{1}{(1-x)^3}\)!推广开来,\(\frac{1}{(1 - x)^k}\)生成的数列是\(\sum_i^\infty C_{i + k - 1}^{k - 1} x^i\)!
蒟蒻:为什么啊?
大佬:你看\(\frac{1}{(1 - x)^k}\)就是\(k\)个\(\frac{1}{1 - x}\)相乘,就是\(k\)个\(1 + x + x^2 + x^3...\)相乘嘛。那么它的第\(i\)项系数就是从\(k\)个\(1 + x + x^2 + x^3...\)中每个选出一项,乘起来恰为\(x^i\)的方案数,就是\(i = x_1 + x_2 + ... + x_k\)的非负整数解的组数,你用组合数学中的所谓“隔板法”求一下,是不是\(C_{i + k - 1}^{k - 1}\)?
蒟蒻:有道理!
大佬:了解了\(\frac{1}{1-x^k}\)和\(\frac{1}{(1-x)^k}\)这两种特殊生成函数,就掌握了一类题的技巧——来做道题吧!Luogu P2000 欢迎你!
大佬:我还会用生成函数求斐波那契数列通项!
蒟蒻:这么牛逼?
大佬:首先啊,你看这个斐波那契数列的生成函数\(f(x) = x + x^2 + 2x^3 + 3x^4 + 5x^5 + 8x^6...\),然后把它乘个\(x\),得\(x\cdot f(x) = x^2 + x^3 + 2x^4 + 3x^5 + 5x^6 + 8x^7...\),用前式减去后式,得到\(f(x) - x \cdot f(x) = x + x ^ 3 + x^4 + 2x^5 + 3x^6 + 5x^7... = x + x^2 \cdot f(x)\),所以\(f(x) = \frac{x}{1 - x - x^2}\)!
蒟蒻:可是这不是我们之前见过的那两种特殊生成函数,你怎么把它还原成数列呢?
大佬:我打算把它变成等比数列求和的形式!这个分母\(1-x-x^2\)是可以因式分解的,分解后就是\((1-\frac{1-\sqrt5}{2}x)(1-\frac{1+\sqrt5}{2}x)\),所以\[\frac{x}{1 - x - x^2} = \frac{x}{(1-\frac{1-\sqrt5}{2}x)(1-\frac{1+\sqrt5}{2}x)}\],看着非常难受,裂项一下,得到\[ \frac{x}{(1-\frac{1-\sqrt5}{2}x)(1-\frac{1+\sqrt5}{2}x)} = -\frac{1}{\sqrt5}\frac{1}{(1-\frac{1-\sqrt5}{2}x)} + \frac{1}{\sqrt5}\frac{1}{(1-\frac{1+\sqrt5}{2}x)}\]这就成了两个等比数列求和公式乘个常数再相加的形式了!把两个等比数列还原成数列,得到\[fib_n = -\frac{1}{\sqrt5}(\frac{1-\sqrt5}{2})^n + \frac{1}{\sqrt5}(\frac{1+\sqrt5}{2})^n\]这就是斐波那契数列通项公式了!
蒟蒻:哇!这么神奇!
大佬:据说这种方法可以应用到各种线性齐次递推中哦~
趣谈生成函数 =v=的更多相关文章
- [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...
- [转]ASP.NET应用程序生命周期趣谈(三) HttpModule
在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...
- 趣谈、浅析CRLF和LF
作为程序员,在处理文件和输入输出的时候经常要跟CRLF和LF打交道.可能大家多少知道一些,但总是记不清楚,我也是这样的,因此写下这篇博文,作为记录. 首先,明确他们的意思:CR(回车),LF(换行). ...
- 深挖计算机基础:趣谈Linux操作系统学习笔记
参考极客时间专栏<趣谈Linux操作系统>学习笔记 核心原理篇:内存管理 趣谈Linux操作系统学习笔记:第二十讲 趣谈Linux操作系统学习笔记:第二十一讲 趣谈Linux操作系统学习笔 ...
- 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径
前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ...
- [转]ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期
在之前的三篇文章中,我们还算简明扼要的学习了asp.net的整个生命周期,我们知道了一个Request进来以后先去ISAPI Filter,发现是asp.net程序后又ASPNET_ISAPI.dll ...
- 趣谈多线程(Python版)
温馨提示:本文篇幅较长,建议读者耐心阅读,本文中的代码经过笔者精心构思,可以复制过去运行一下,观察输出结果,所有代码在python3.5.0中测试通过. 文章目录 What is 多线程? Why w ...
- [转]ASP.NET应用程序生命周期趣谈(二)
在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1, IIS肯定是没有眼睛 ...
- [转]ASP.NET应用程序生命周期趣谈(一)
这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...
随机推荐
- Ionic app 通知在Moto 360 Watch上显示通知(2)
在前一篇文章中,我们已经将Wtach的环境测试成功,下面进入我们自己消息的接收. 1.安装JPush插件在我们的App中,这个具体步骤可以参考 Ionic 安装JPush过程 2.在App上的登录模块 ...
- Zookeeper-基本概念
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务.它是一个典型的分布式数据一致性的解决方案,分布式应用可以基于它实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知.集群管理 ...
- RabbitMQ --- Hello Mr.Tua
目录 RabbitMQ --- Work Queues(工作队列) RabbitMQ --- Publish/Subscribe(发布/订阅) RabbitMQ --- Routing(路由) 安装环 ...
- 【亲测有效】运行docker ps 出现Got permission denied问题的解决方案
问题描述 今天在运行 docker ps 命令的时候出现如下问题: Got permission denied while trying to connect to the Docker daemon ...
- 系统、决策、控制研究系列(SSDC)
本类目主要介绍的书籍来自springer的系列书籍中的一本,对于该系列书籍介绍如下: “系统.决策及控制研究”(SSDC)系列涵盖了在广泛认知的系统.决策及控制的各个领域的快速.最新和高质量的最新发展 ...
- [T-ARA][남주긴 아까워][给别人可惜了]
歌词来源:http://music.163.com/#/song?id=29343992 作曲 : 二段横踢/Radio Galaxi [作曲 : 二段横踢/Radio Galaxi] 作词 : 二段 ...
- ml-模型评估与选择
1.基本概念 错误率E=分类错误的样本数a/总样本数m:精度=1-a/m 经验误差/训练误差:在训练集上产生的 泛化误差:在测试集上产生的=====>要把这个泛化误差降到最小化. 2.评估方法 ...
- Java源码--Array
1. Arrays.asList() 该方法是将数组转化为List,需要注意以下几点: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolea ...
- Orcle安装环境及步骤
Windows7环境下如何成功安装Oracle数据库 随着微软新一代操作系统 Windows7 的正式发行,使用 Windows7 的朋友也越来越多,很多人在 Windows7 环境下安装 ...
- JavaScript表单验证登录
在登录时,通常是将输入的信息原封不动的传送给后端的处理程序,然后处理之后返回结果,那么可能后端服务器的压力就很大,所以可以先在提交表单之前进行一些简单的检测,然后再发给后端,减小服务器的一部分压力: ...