趣谈生成函数 =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应用程序生命周期.这篇就是了. ...
随机推荐
- 开源的mqtt服务器
看介绍挺强大,开源,可运行在Linux和Windows,文档中有相关测试工具,及客户端介绍. 希望有机会应用.http://www.emqtt.com/
- Asp.Net MVC 获取当前 Controller Action Area
获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); 获取Action名称: ViewContext.Ro ...
- EXPERT FOR SQL SERVER诊断系列--索引
概述 索引设计是数据库设计中比较重要的一个环节,对数据库的性能起着至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其 ...
- 小白学Docker之基础篇
系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记总结 1. docker是什么 百科上的 ...
- Oracle_忘记密码
1.运行到C盘根目录 2.输入:SET ORACLE_SID = 你的SID名称 3.输入:sqlplus/nolog 4.输入:connect/as sysdba 5.输入:altre user s ...
- tableView优化思路
一般优化的思路: 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法. 复杂界面可采用异步绘制. 在大量图片展示时,可以滑动时按需加载. 尽量少用或不 ...
- mysql 多列索引的生效规则,生成1000w数据的存储过程
https://www.cnblogs.com/codeAB/p/6387148.html
- 第二次作业 --- 我对QQ的评测
腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功能,并可与多 ...
- 《Linux内核设计与实现》 第五周 读书笔记(第十八章)
第18章 调试 20135307张嘉琪 18.1 准备开始 18.2 内核中的bug 内核中的bug多种多样,它们的产生可以有无数的原因,同时它们的表象也变化多端,从明白无误的错误代码(比如,没有把正 ...
- 实践——ELF文件格式分析
一.分析文件头 1. 段入口类型定义(/usr/include/elf.h)下面产生的hello是32位的 使用命令#Hexdump –x ELF_1.o 第一行: 前4字节,蓝色部分,是一个魔数,表 ...