趣谈生成函数 =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. QueryHelper

    [1].[代码] QueryHelper.java 跳至 [1] package my.db; import java.io.Serializable; import java.math.BigInt ...

  2. 写入mssql出现乱码

    1.出现乱码的场景如下: --------------------------------------------------------------------------------------- ...

  3. Centos下添加静态路由(临时和永久有效)的操作记录

    公司IDC机房服务器上部署了一套外网LB环境,默认配置的是外网ip的路由地址,由于要和其他内网机器通信,所以需要配置内网ip的路由地址.整个操作过程,记录如下,以供以后参考学习: 1)内网网卡绑定 [ ...

  4. Redis常用操作-----字符串

    1.APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND 就简单地将给定 ...

  5. 12.10 Daily Scrum

    各种大作业,进度会放缓一些.   Today's Task Tomorrow's Task 丁辛 完善餐厅列表,显示距离. 实现和菜谱相关的餐厅列表.             邓亚梅          ...

  6. jsp获取传过来的值

    request.setCharacterEncoding("utf-8"); String credit=request.getParameter("credit&quo ...

  7. 最终版alpha阶段总结

    这是我们组最终的alpha阶段总结,我和陈汝婷虽然最后做的没有想象的好,时间也很紧急,但是真的学到很多,毕竟现在我们两个人做的活是其他组四个人做的活,其实能做到这样,哪怕这样,我们也觉得没有什么遗憾了 ...

  8. IE下JS保存图片

    function ieSave()                   {                       var img = document.images[0];            ...

  9. liuyan

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 【历史】- Windows NT 之父 - David Cutler

    David Cutler,大卫·卡特勒,一位传奇程序员,1988年去微软前号称硅谷最牛的内核开发人员,是VMS和Windows NT的首席设计师,被人们成为“操作系统天神”.他曾供职于杜邦.DEC等公 ...