首页 > 其他分享 >生成函数

生成函数

时间:2025-01-16 20:44:19浏览次数:1  
标签:dots frac 函数 sum 数列 生成 rightarrow

生成函数浅讲

感觉这是一个非常牛逼的东西,写了点自己的感悟,可能讲得不是很清楚。

生成函数的定义就比较牛,将数列 \(\{a_i\}\) 写成一个函数 \(A(x)=\sum{a_ix^i}\) 的形式叫做普通生成函数。

此处的 \(x^i\) 没有实际意义,只是一个占位符。对于生成函数来说,绝大数多项式的运算法则都是可以用的。

比如:

\(A(x)+B(x) = \sum\limits{(a_i+b_i)x^i}\)

\(A(x)B(x)=\sum\limits_i\sum\limits_j(a_ib_j)x^{i+j}\)。

一些常见的数列都可以写作生成函数的形式,而且往往都有较为简单的封闭形式:

\(\{1,0,0\dots\}\rightarrow 1\)

\(\{0,1,0\dots\}\rightarrow x\)

\(\{1,1,1\dots\}\rightarrow 1+x+x^2+\dots=\frac{1}{1-x}\)

\(\{1,0,1,0,1\dots\}\rightarrow 1+x^2+x^4\dots=\frac{1}{1-x^2}\)

拓展一下它们的乘积有什么含义

乘 \(x^k\) 相当于将数列向后平移 \(k\) 位。

乘 \(\frac{1}{1-x}\) 相当于对数列做一次前缀和,而 \(\frac1{(1-x)^k}\) 就是求 \(k\) 次前缀和,把这个过程写出来就会发现很像一个旋转了一下的杨辉三角,第 \(i\) 就是 \({i+k-1}\choose{k-1}\) 。

乘 \(\frac1{1-x^p}\) 后第 \(i\) 位就是原数列第 \(i\) 位往前第 \(p\) 的整数倍的位的前缀和(听着很绕其实很简单,笔者试图用简洁的语言的描述但语文水平不允许),类似的 \(\frac1{(1-x^p)^k}\) 的数列只在 \(p\) 的整数倍的位上有值并且第 \(ip\) 位为 \({i+k-1}\choose{k-1}\) 。

然后我们就可以用生成函数做一些很牛的事情。

先看一道简单题:

P10780 食物

题意:在许多不同种类的食物中选出 \(n\) 个,每种食物的限制如下:

  • 承德汉堡:偶数个

  • 可乐:\(0\) 个或 \(1\) 个

  • 鸡腿:\(0\) 个,\(1\) 个或 \(2\) 个

  • 蜜桃多:奇数个

  • 鸡块:\(4\) 的倍数个

  • 包子:\(0\) 个,\(1\) 个,\(2\) 个或 \(3\) 个

  • 土豆片炒肉:不超过一个。

  • 面包:\(3\) 的倍数个

每种食物都是以「个」为单位,只要总数加起来是 \(n\) 就算一种方案。对于给出的 \(n\) ,你需要计算出方案数,对 \(10007\) 取模。(\(n\le 10^{500}\))

\(sol\):首先对于每种食物构造一个数列,数列的第 \(i\) 位表示总数为 \(i\) 时这种食物有多少选法,显然只有 \(0/1\) ,如下:

\(\{1,0,1,0,1\dots\}\rightarrow 1+x^2+x^4\dots=\frac1{1-x^2}\)

\(\{1,1,0,0,0\dots\}\rightarrow 1+x\)

\(\{1,1,1,0,0\dots\}\rightarrow 1+x+x^2\)

\(\{0,1,0,1,0\dots\}\rightarrow x+x^3+x^5\dots=\frac{x}{1-x^2}\)

\(\{1,0,0,0,1,0\dots\}\rightarrow 1+x^4+x^8\dots=\frac1{1-x^4}\)

\(\{1,1,1,1,0\dots\}\rightarrow 1+x+x^2+x^3\)

\(\{1,1,0,0,0\dots\}\rightarrow 1+x\)

\(\{1,0,0,1,0\dots\}\rightarrow 1+x^3+x^6\dots=\frac1{1-x^3}\)

然后把它们乘起来就把数量上的加法转化为了系数上的相加,所以总数为 \(n\) 的答案就变成了 \(x^n\) 的系数。结果化简一下就是 \(\frac x{(1-x)^4}\) ,然后结合上面总结的 \(\frac x{(1-x)^k}\) 的规律,可以得到答案就是 \({n+2\choose3}\),边读入边取模即可。

这道题中的生产函数是比较显然的,但是很多题目需要我们通过生产函数转化一些其他做法,比如这道题:

[国家集训队] 整数的lqp拆分

定义 \(F_0=0,F_1=1,F_n=F_{n-1}+F_{n-2} (n>1)\) (其实就是斐波那契数列)

\(\sum\prod\limits_{i=1}^m F_{a_i}\)

\(m>0\)

\(a_1,a_2...a_m>0\)
\(a_1+a_2+...+a_m=n\)
由于答案可能非常大,所以要对 \(10^9 + 7\) 取模。(\(1\le n \le 10^{10000}\))

\(sol\) :首先考虑DP,设 \(f_{i,j}\) 表示固定 \(m\) 为 \(i\) ,\(n\) 为 \(j\) 时的答案。然后就会发现一个非常显然的暴力转移:\(f_{i,j}=\sum\limits_{k=0}^jf_{i-1,k}F_{j-k}\),按理来说这里的 \(k\) 只能从 \(1\) 枚举到 \(j-1\) 但是 \(F_0=0,f_{i,0}=0\) 所以对答案是没有影响的。最终答案就应该是 \(\sum\limits_{i=1}^nf_{i,n}\) 。我们把 \(f_{i-1}\) 到 \(f_i\) 的递推看成一次卷积操作,就会发现 \(f_i=F^i\) ,那么答案对应的生成函数就是 \(\sum\limits_{i=1}^nF^i\) 。看着似乎不太可做,但是我们发现当 \(i>n\) 时,\(F^i\) 的第 \(n\) 项显然为 \(0\) 所以可以改写成 \(\sum\limits_{i=1}^{\infty} F^i=\frac F{1-F}\) ,把斐波那契数列的生成函数 \(F=\frac{x}{1-x-x^2}\) 代进去就是 \(\frac x{1-2x-x^2}\) ,这个生成函数可以用特征根来解出来,这里详细讲一下。

分子就是平移一位是好处理的,而分母转换一下就是

\(f_0=1,f_1=2,f_{n+1}=2f_n+f_{n-1}\)

我们考虑把后面的式子写成一种等比数列的形式:

\(f_{n+1}-pf_n=q(f_n-pf_{n-1})\)

然后我们可以求出这个等比数列的通项:

\(f_{n+1}-pf_n=q^n(f_1-pf_0)\)

\(p\) 和 \(q\) 应该满足条件:

\(pq=-1,p+q=2\)

所以 \(p\) 和 \(q\) 是方程 \(x^2-2x-1=0\) 的两个根 \(1+\sqrt2\) 和 \(1-\sqrt2\) ,

标签:dots,frac,函数,sum,数列,生成,rightarrow
From: https://www.cnblogs.com/Re-Star/p/18675725

相关文章

  • 使用QFuture和QFutureWatcher实现不阻塞界面的Async函数
    简述很多时候,在Qt里面需要运行一个耗时函数的时候,为了避免阻塞界面,需要放入非主线程去执行。实现这样处理的方法有好几种,例如:写一个继承自QThread类,实现run接口;写一个继承自QObject的类,添加槽函数执行任务,创建对象,移入一个QThread中进行调用;写一个QRunnable的子类,创建对象,添......
  • C++ 面向对象(构造 & 析构函数)
    二、构造&析构函数2.1构造和析构2.1.1功能构造函数功能构造函数在类实例化对象时用于完成对象成员的初始化,通常包括以下操作:   1.为成员变量分配内存空间   2.初始化成员变量   3.执行类似打开文件、分配资源等额外操作析构函数功能主要作用......
  • unity里生成的.csproj和.sln :assembly definition
    有一段时间一直没明白为啥有的时候第三方的package里的代码没法引用我们项目的,最近有点心得,记录下:在创建unity项目的时候默认是创建一个解决方案就是以.sln为结尾的。默认开发时都在同一个解决项目里,所以不会出现相互引用不到的问题。当我们引用到第三方的package时就会出现引用......
  • 使用excel生成简单的日历
    思路比较简单,样式也单一,丑了点。采用宏和时间函数,计算单元格偏移量,进行单元格填充。SubGenerateYearCalendar()DimwsAsWorksheetSetws=ThisWorkbook.Sheets("Sheet1")'更改为你使用的表名DimyearAsIntegeryear=InputBox("请输入年份(如......
  • 使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级
    一、API的选择我们进行接口测试需要API文档和系统,我们选择JSONPlaceholder免费API,因为它是一个非常适合进行接口测试、API测试和学习的工具。它免费、易于使用、无需认证,能够快速帮助开发者模拟常见的接口操作(增、删、改、查)。尤其对于我你们学习接口测试的初学开发者来说,它......
  • 插值函数和插值多项式
    目录插值函数插值多项式插值函数设函数y=f(x)f(x)f(x)在区间......
  • 函数间断点 | 可去间断点 / 第一类间断点 / 第二类间断点 / 狄利克雷函数和黎曼函数示
    注:机翻,未校。BasicDefinitionsandExamples基本定义与示例Definition5:Ifapointofdiscontinuitya∈Ea\inE......
  • 解决cmake编译时*ui,*h存放在不同文件夹下时*.ui无法生成ui_*.h问题
    使用的Qt版本为6.8.1,cmake版本为3.31.0-rc1。遇到问题原因原本的目录结构比较乱,代码文件一多就很不好找,在对文件进行分类管理的过程中发现*ui文件无法生成ui_*.h有问题部分的cmake本来想使用qt_wrap_ui和set(CMAKE_AUTOUICON)让他自动生成ui_*.h的,但是失败了cmake_minimum_......
  • Python生成成绩报告单:从理论到实践
    在教育信息化日益普及的今天,自动化生成和处理学生成绩报告单已成为学校和教育机构的一项重要任务。Python作为一种功能强大且易于学习的编程语言,非常适合用于这种数据处理和报告生成任务。本文将详细介绍如何使用Python生成成绩报告单,包括理论概述和完整的代码示例。一、理论概述......
  • 莫比乌斯函数及其反演
    一些定义数论函数定义域为正整数的函数,一般分类如下:积性函数对于\(\forallx,y\inN,gcd(x,y)=1\),若\(f(x\cdoty)=f(x)\cdotf(y)\),则\(f\)是积性函数。完全积性函数对于\(\forallx,y\inN\),若\(f(x\cdoty)=f(x)\cdotf(y)\),则\(f\)是完全积性函数......