Processing math: 100%

0. 前置芝士

0.1. 导数

0.1.1. 常用导数

(ax)=axlna

特别地,(ex)=exlne=ex.

(sinx)=cosx

(cosx)=sinx

(xa)=axa1

(lnx)=1x

一个总结性公式

(xa)(n)=a!(an)!xan

0.1.2. 运算法则

  • 加减可以直接拆开。

  • 乘法:

    (f(x)g(x))=f(x)g(x)+f(x)g(x)

  • 除法:

    (f(x)÷g(x))=f(x)g(x)f(x)g(x)g2(x)

0.2. 泰勒展开

详情请见 [干饭现场] 多项式全家桶

1. 普通生成函数(OGF

1.1. 定义

对于一个无穷序列 {a0,a1,a2,...},定义其普通生成函数为形式幂级数:k=0akxk.

1.2. 常用普通生成函数

1.2.1. 斐波那契数列

首先可以推导出它的封闭形式。

在泰勒展开的 0.1.2. 一些常见的展开 中,我们已经推导出 1(1x)a+1 的展开。所以可以尝试利用它来展开 F(x).

比方说,考虑 A1ax 的形式可以写成幂级数 An0(ax)n,我们可以将 1xx2 进行因式分解成 (1ax)(1bx) 的形式。

或者,也可以使用整体法,不用因式分解,直接硬套。

1.2.2. 广义五边形数

1.2.2.1. 基本公式与定理

证明部分略去不讲。

  • 广义五边形数的通项公式为

pn=n(3n1)2

  • 定义欧拉函数为

    ϕ(x)=i=1(1xi)

    五边形数定理即为

    ϕ(x)=i=0(1)ixi(3i1)2

    hintϕ(x) 的第 n 项系数就是 "将 n 拆成偶数个正整数的方案数 n 拆成奇数个正整数的方案数"。注意这里拆分出来的数字 两两不同

1.2.2.2. 整数拆分

定义 pn 表示把 n 拆分成若干个 可以相等 的整数的方案数。由此设计出 pn 的生成函数

F(x)=i=1pixi=i=1(1+xi+x2i+)=i=111xi

很容易发现有 F(x)ϕ(x)=1。于是可以构造出 ϕ(x) 然后直接多项式求逆做到 O(nlogn).

如果并不要求更优秀的复杂度的话,我们可以暴力展开第 n 项的系数(右边由于只有常数项,所以系数为零)

pnpn1pn2+pn5+pn7=0

函数传入的值实际上是 n 减去广义五边形数。由于广义五边形数的增长速度是 n2 的,所以可以递推 p 数列,单次递推 O(n),总复杂度 O(nn).

1.2.3. 卡特兰数列

Portal.

2. 指数生成函数(EGF

2.1. 定义

对于一个无穷序列 {a0,a1,a2,...},定义其指数生成函数为形式幂级数:k=0akxkk!.

指数生成函数乘法的意义:🔗

2.2. 常用指数生成函数

  • {1,1,1,1,1}EGFex
  • {1,1,1,1,1}EGFex
  • {1,c,c2,c3}EGFecx
  • {1,0,1,0,1,0}EGFex+ex2
  • {1,a,a2_,a3_,a4_}EGF(1+x)a,同时这个序列第 i 项的意义是 a 个元素的 i 排列数,也就是 C(a,i)i!.

2.3. 可爱的例题们

例 1:8 个元素,其中有 3a12a23a3。从中取 6 个元素,求可能的排列数。

ˆG(x)=(1+x1!+x22!+x33!)(1+x1!+x22!)(1+x1!+x22!+x33!)

除以阶乘相当于去除内部元素的顺序,最终将 xi 项前的系数统一提出 1i!,分子就是取 i 个元素的排列数。考虑提出 1i! 相当于给分子乘上 i!.


例 2:带标号无向连通图计数。

首先设 fi 表示 i 个点的有标号连通图个数,gi 表示 i 个点的任意图个数,那么 gi=2C(i,2).

fi 的指数生成函数为 F(x)gi 的指数生成函数为 G(x)。那么有

G(x)=i1Fi(x)i!

考虑证明。假设点个数为 n,分为大小为 a1,a2,,ak 的组。首先分配标号,系数为 n!ki=1ai!,于是有

gn=k11k!(ai=nn!ki=1ai!ki=1fai)

前面的 1/k! 是将划分出的图的标号去除。化一下柿子得

gnn!=k11k!(ai=nki=1faiai!)

大括号那一坨是 [xn]Fk(x)。于是

gnn!=k1[xn]Fk(x)k!G(x)=k1Fk(x)k!

可以发现上面的 Fk(x)k! 就是 eF(x) 的泰勒展开,所以有

G(x)=expF(x)F(x)=lnG(x)

所以求出 G(x) 后再多项式求 ln 即可得到答案。另外容易发现这个结论也可以结合 pruefer 序列应用于生成树计数。

哦哟还可以发现这也是排列与圆排列的关系。同时还可以根据这个推导错排数的指数生成函数:考虑错排就是置换环中不存在自环的排列,先构造 "置换环不存在自环的圆排列" 的指数生成函数

n2(n1)!xnn!=n2xnn=ln(1x)x

于是错排数的 EGF 就是 exp(ln(1x)x).


例 3:给出 n,在 有哈密顿回路的 n 个点的竞赛图中等概率选出一个,求哈密顿回路个数的期望。

首先对期望进行转化,就是所有 n 个点的竞赛图中哈密顿回路数量总和除以有哈密顿回路的 n 个点的竞赛图数量。

第一个部分是比较好计算的,就是 (n1)!2C(n,2)n,也就是枚举哈密顿回路,再枚举其它边。

而关于有哈密顿回路的 n 个点的竞赛图数量,这里有个结论:一张竞赛图有哈密顿回路的充要条件是它是强连通的。证明我翻了翻网上的一些博客,也许是没有 get 到关键,感觉有些证明有些伪,所以现在就咕咕咕了(。

fin 个点且强连通的竞赛图数量,可以正难则反

fn=2C(n,2)n1i=1fi(ni)2C(ni,2)

再移项得

2C(n,2)=ni=1fi(ni)2C(ni,2)

右式类似卷积,用 OGF 描绘中间的组合数是不易的。但考虑 (ni)=n!i!(ni)!,这实际上就明示使用 EGF 了!所以令

F(x)=i=1fii!xi,G(x)=i=02C(i,2)i!xi

把这两个函数卷起来(注意特判 i=0 的情况)

G(x)=F(x)G(x)+1

多项式求逆即可求解 G(x).

posted on   Oxide  阅读(181)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
历史上的今天:
2020-02-18 [学习笔记] LCT
2020-02-18 [杂题合集] 即使你读不完一本书,至少可以读完这篇营销软文吧?
2020-02-18 [学习笔记] 线性规划



点击右上角即可分享
微信分享提示