趣谈生成函数 =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=的更多相关文章

  1. [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说

    Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...

  2. [转]ASP.NET应用程序生命周期趣谈(三) HttpModule

    在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...

  3. 趣谈、浅析CRLF和LF

    作为程序员,在处理文件和输入输出的时候经常要跟CRLF和LF打交道.可能大家多少知道一些,但总是记不清楚,我也是这样的,因此写下这篇博文,作为记录. 首先,明确他们的意思:CR(回车),LF(换行). ...

  4. 深挖计算机基础:趣谈Linux操作系统学习笔记

    参考极客时间专栏<趣谈Linux操作系统>学习笔记 核心原理篇:内存管理 趣谈Linux操作系统学习笔记:第二十讲 趣谈Linux操作系统学习笔记:第二十一讲 趣谈Linux操作系统学习笔 ...

  5. 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径

    前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ...

  6. [转]ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期

    在之前的三篇文章中,我们还算简明扼要的学习了asp.net的整个生命周期,我们知道了一个Request进来以后先去ISAPI Filter,发现是asp.net程序后又ASPNET_ISAPI.dll ...

  7. 趣谈多线程(Python版)

    温馨提示:本文篇幅较长,建议读者耐心阅读,本文中的代码经过笔者精心构思,可以复制过去运行一下,观察输出结果,所有代码在python3.5.0中测试通过. 文章目录 What is 多线程? Why w ...

  8. [转]ASP.NET应用程序生命周期趣谈(二)

    在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1,    IIS肯定是没有眼睛 ...

  9. [转]ASP.NET应用程序生命周期趣谈(一)

    这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就是了. ...

随机推荐

  1. ionic 访问odoo11之具体业务类api接口

    在前面测试通过odoo登录的功能,这次的问题重点是如何访问后台具体的业务类的接口呢?这次就以我们在odoo中安装的lunch模块为例,目标是获取lunch.alert的数据,如下图 具体过程接上次文章 ...

  2. 校内模拟赛 虫洞(by NiroBC)

    题意: n个点m条边的有向图,每一天每条边存在的概率都是p,在最优策略下,询问从1到n的期望天数. 分析: dijkstra. 每次一定会优先选dp最小的后继走,如果这条边不存在,选次小的,以此类推. ...

  3. 基于BlogEngine.NET搭建个人博客

    早些时候在万网以我自己的英文名买了个域名 giantliu.com又看到万网有一个免费版本的虚拟主机,而且还支持.net4.5这年头支持.net4.5的免费主机不多,本来想用阿里云/windows a ...

  4. mysql下批量清空某个库下的所有表(库不要删除,保留空库)

    总所周知,mysql下要想删除某个库下的某张表,只需要切换到该库下,执行语句"drop table tablename"即可删除!但若是该库下有成百上千张表,要是再这样一次次执行d ...

  5. ZooKeeper 典型的应用场景——及编程实现

    如何使用 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储 ...

  6. 理解使用static import 机制

    J2SE 1.5里引入了“Static Import”机制,借助这一机制,可以用略掉所在的类或接口名的方式,来使用静态成员.本文介绍这一机制的使用方法,以及使用过程中的注意事项. 在Java程序中,是 ...

  7. oracle系统化学习笔记

    CentOS 4.x上安装Oracle 9i(3讲) oracle9i非常成熟,刚学主要是学9i比较经典 学会安装9i具有现实意义,先学完9i再学11g等比较好 1.安装centos 2.安装orac ...

  8. 《Linux内核分析》第八周学习总结

    <Linux内核分析>第八周学习总结                                      ——进程的切换和系统的一般执行过程 姓名:王玮怡  学号:20135116 ...

  9. Hibernate_core_method

    /** * Created by Administrator on 2015/11/30. *HibernateUtil */public class HibernateUtil { private ...

  10. 圆桌的项目Alpha冲刺(团队)

    (a) 项目课堂演示 (b) 10篇冲刺随笔 冲刺之一 冲刺之二 冲刺之三 冲刺之四 冲刺之五 冲刺之六 冲刺之七 冲刺之八 冲刺之⑨ 冲刺之十 (c) 1篇测试随笔 测试随笔 (d) 1篇冲刺总结随 ...