本文章是[学习笔记]生成函数进阶的一部分
重点当然是谈它的运用了…
0.前置知识
如果你实在不想看的话可以直接看第二部分的那张图片,对后面学习没任何影响。
1.普通生成函数(OGF)
1.1定义
对于一个无穷序列 { a 0 , a 1 , a 2 , ⋅ ⋅ ⋅ } \{a_0, a_1, a_2, · · · \} {a0,a1,a2,⋅⋅⋅},定义其普通生成函数为级数: ∑ k = 0 ∞ a k ⋅ x k \sum ^∞_{k=0}a_k · x_k ∑k=0∞ak⋅xk。
1.2 形式幂级数
形式幂级数顾名思义,就是我们不考虑
x
x
x的收敛性(你可以认为是不考虑是否在任意取值下正确或者有意义)化简出的形式,这里的
x
x
x其实就是一个符号而已,并不是一个数,因此我们如果代入实际值的话可能会出现错误。
我们根据常用函数的泰勒公式对一些特殊函数进行化简。
•
{
1
0
!
,
1
1
!
,
1
2
!
,
⋅
⋅
⋅
,
1
k
!
,
⋅
⋅
⋅
}
\{\frac{1}{0!}, \frac{1}{1!}, \frac{1}{2!}, · · · ,\frac{1}{k!},· · ·\}
{0!1,1!1,2!1,⋅⋅⋅,k!1,⋅⋅⋅}的形式幂级数为
e
x
e^x
ex
•
{
1
,
1
,
1
,
⋅
⋅
⋅
}
\{1,1,1,· · ·\}
{1,1,1,⋅⋅⋅}的形式幂级数为
1
1
−
x
\frac{1}{1-x}
1−x1
•
{
1
,
2
,
4
,
⋅
⋅
⋅
}
\{1,2,4,· · ·\}
{1,2,4,⋅⋅⋅}的形式幂级数为
1
1
−
2
x
\frac{1}{1-2x}
1−2x1
sol:我们将
2
k
2^k
2k和
x
k
x^k
xk看成一个整体就好。
•
{
1
,
0
,
1
,
⋅
⋅
⋅
}
\{1,0,1,· · ·\}
{1,0,1,⋅⋅⋅}的形式幂级数为
1
1
−
x
2
\frac{1}{1-x^2}
1−x21
sol:我们将
x
k
x^{k}
xk看成
(
x
2
)
k
2
(x^2)^{\frac{k}{2}}
(x2)2k,于是又变成了
{
1
,
1
,
1
,
⋅
⋅
⋅
}
\{1,1,1,· · ·\}
{1,1,1,⋅⋅⋅}。
•
{
0
,
1
,
0
,
⋅
⋅
⋅
}
\{0,1,0,· · ·\}
{0,1,0,⋅⋅⋅}的形式幂级数为
x
1
−
x
2
\frac{x}{1-x^2}
1−x2x
sol:相当于上面的左移了一位。
•
{
1
,
2
,
3
,
⋅
⋅
⋅
}
\{1,2,3,· · ·\}
{1,2,3,⋅⋅⋅}的形式幂级数为
1
(
1
−
x
)
2
\frac{1}{(1-x)^2}
(1−x)21
sol1:我们发现对
1
+
x
+
x
2
+
x
3
+
.
.
.
1+x+x^2+x^3+...
1+x+x2+x3+...求导之后就是
1
+
2
x
+
3
x
2
+
4
x
3
+
.
.
.
1+2x+3x^2+4x^3+...
1+2x+3x2+4x3+...。
因此
d
(
1
+
x
+
x
2
+
x
3
+
.
.
.
)
d
x
=
1
(
1
−
x
)
2
\frac{\mathrm{d} (1+x+x^2+x^3+...)}{\mathrm{d} x}=\frac{1}{(1-x)^2}
dxd(1+x+x2+x3+...)=(1−x)21
sol2:发现
{
1
,
2
,
3
,
⋅
⋅
⋅
}
\{1,2,3,· · ·\}
{1,2,3,⋅⋅⋅}就是两个
{
1
,
1
,
1
,
⋅
⋅
⋅
}
\{1,1,1,· · ·\}
{1,1,1,⋅⋅⋅}的卷积,然后就没了。
•
{
4
,
5
,
7
,
10
,
14
,
⋅
⋅
⋅
}
\{4,5,7,10,14,· · ·\}
{4,5,7,10,14,⋅⋅⋅}的形式幂级数为
1
(
1
−
x
)
3
+
4
1
−
x
\frac{1}{(1-x)^3}+\frac{4}{1-x}
(1−x)31+1−x4。
sol:首先常数项不为
0
0
0,我们可以先分离出
{
4
,
4
,
4
,
⋅
⋅
⋅
}
\{4,4,4,· · ·\}
{4,4,4,⋅⋅⋅},就是
4
1
−
x
\frac{4}{1-x}
1−x4。
现在剩下
{
0
,
1
,
3
,
6
,
⋅
⋅
⋅
}
\{0,1,3,6,· · ·\}
{0,1,3,6,⋅⋅⋅},而它就是三个
{
1
,
1
,
1
,
⋅
⋅
⋅
}
\{1,1,1,· · ·\}
{1,1,1,⋅⋅⋅}的卷积,所以是
1
(
1
−
x
)
3
\frac{1}{(1-x)^3}
(1−x)31。
1.3 应用
1.3.1 经典小例题
有四种无限多的水果,要求第一种恰好拿出偶数个,第二种恰好拿出 5 5 5的倍数个,第三种最多拿 4 4 4 个,第四种最多拿 1 1 1 个,求恰好拿出 n n n 个水果的方案数。
答案:
1
1
−
x
5
⋅
1
1
−
x
2
⋅
(
1
+
x
+
x
2
+
x
3
+
x
4
)
⋅
(
1
+
x
)
=
1
(
1
−
x
)
2
\frac{1}{1-x^5}·\frac{1}{1-x^2}·(1+x+x^2+x^3+x^4)·(1+x)=\frac{1}{(1-x)^2}
1−x51⋅1−x21⋅(1+x+x2+x3+x4)⋅(1+x)=(1−x)21
把它又变成一般形式就会发现答案就是
n
+
1
n+1
n+1。
提示:
(
1
−
x
5
)
=
(
1
−
x
)
⋅
(
1
+
x
+
x
2
+
x
3
+
x
4
)
(1-x^5)=(1-x)·(1+x+x^2+x^3+x^4)
(1−x5)=(1−x)⋅(1+x+x2+x3+x4)。
1.3.2 用OGF推导数列通项公式
Fibonacci 数列
反正你知道最终答案就是
f
i
=
1
5
(
(
1
1
+
5
)
n
−
(
1
1
−
5
)
n
)
f_i=\frac{1}{\sqrt{5}}((\frac{1}{1+\sqrt{5}})^n-(\frac{1}{1-\sqrt{5}})^n)
fi=51((1+51)n−(1−51)n)就行了(逃)。
Catlan数
其实比求Fibonacci 数列简单。
需要注意的有两个地方:
1.解完 G ( x ) G(x) G(x)后我们得到了两个根,在检验的时候我们带入了 x = 0 x=0 x=0(趋近于)检验常数项来验根。虽然形式幂级数按道理不能够代入值,但是我们能够确定 x = 0 x=0 x=0是正确的,因此直接的代入。
2.倒数第二行用到了泰勒展开(常用函数的最后一个公式),是因为我们不知道带根号的多项式代表着什么。
2.指数生成函数(EGF)
2.1定义
对于一个无穷序列 { a 0 , a 1 , a 2 , ⋅ ⋅ ⋅ } \{a_0, a_1, a_2, · · · \} {a0,a1,a2,⋅⋅⋅},定义其指数生成函数为级数: ∑ k = 0 ∞ a k ⋅ x k k ! \sum ^∞_{k=0}a_k · \frac{x_k}{k!} ∑k=0∞ak⋅k!xk。
普通生成函数通常用来解决无标号计数问题,指数生成函数通常用来解决带标号的计数问题,通常带标号计数问题都比有标号计数简单。
2.2 应用
2.2.1 排列与圆排列
首先我们要知道的是,在带标号计数指数函数计数问题中,只要我们能够把一个大问题拆分成若干个子问题,就会有类似
P
(
x
)
=
e
C
(
x
)
P(x)=e^{C(x)}
P(x)=eC(x)的结论(证明由于时间问题来不及写)。
那么对于上面的问题,一个排列可以被我们拆成若干个循环节,而每个循环节的方案数都是大小的圆排列数,就满足了上述条件。
2.2.2 错排问题
设错排数EGF为
D
(
x
)
D(x)
D(x)。
我们发现对于一个排列我们仍然可以拆成若干循环节,只要每个循环节的大小不为
1
1
1,我们就有方案使它错开。
因此答案其实就是
P
(
x
)
=
e
C
(
x
)
−
x
P(x)=e^{C(x)-x}
P(x)=eC(x)−x。
2.2.3 有标号无向连通图个数
一个非常重要的运用。
我们很容易手算出有标号无向图的生成函数是
f
(
x
)
=
∑
n
=
0
∞
2
(
n
2
)
⋅
x
n
n
!
f(x)=\sum^{∞}_{n=0}2^{\binom{n}{2}}·\frac{x^n}{n!}
f(x)=∑n=0∞2(2n)⋅n!xn。
根据2.2.1的结论就有有标号无向连通图个数的生成函数就是
g
(
x
)
=
ln
f
(
x
)
g(x)=\ln f(x)
g(x)=lnf(x)。
这样我们就可以
O
(
n
log
n
)
O(n\log n)
O(nlogn)求
g
(
x
)
g(x)
g(x)了。