一.生成函数定义.
生成函数:定义一个无穷数列 f i f_i fi的(普通型)生成函数 F ( x ) = ∑ i = 0 + ∞ f i x i F(x)=\sum_{i=0}^{+\infty}f_ix^{i} F(x)=∑i=0+∞fixi,其中 x i x^{i} xi只是一个标志.
生成函数本质上是定义在复数域上的形式幂级数.
并不是所以初等函数及其复合都是一个有意义的生成函数,事实上一个有意义的生成函数 F ( x ) F(x) F(x)需要满足存在无穷数集 S S S,使得对于任意 x ∈ S x\in S x∈S有 F ( x ) F(x) F(x)收敛.
当然,由于常数项必须收敛,所以一个有意义的生成函数还需要满足在 0 0 0处收敛.
生成函数在OI中的主要用途是实现利用FFT实现快速计数,当然也存在许多可以直接推式子的生成函数题.
二.普通型生成函数的卷积.
生成函数的卷积即为多项式卷积,对于两个数列
f
,
g
f,g
f,g的生成函数卷积
h
h
h,有:
h
i
=
∑
j
=
0
i
f
j
g
i
−
j
h_i=\sum_{j=0}^{i}f_jg_{i-j}
hi=j=0∑ifjgi−j
这个式子在各类组合计数题中频繁出现,最常见的应用就是优化背包.
再列举几个常见的普通型生成函数:
1
1
−
x
=
1
+
x
+
x
2
+
⋯
=
∑
i
=
0
+
∞
x
i
1
1
−
c
x
n
=
1
+
c
x
n
+
c
2
x
2
n
+
⋯
=
∑
i
=
0
+
∞
c
i
x
i
n
(
1
+
x
)
n
=
(
n
0
)
+
(
n
1
)
x
+
(
n
2
)
x
2
+
⋯
=
∑
i
=
0
+
∞
(
n
i
)
x
i
ln
(
1
1
−
x
)
=
x
+
1
2
x
2
+
1
3
x
3
+
⋯
=
∑
i
=
1
+
∞
1
i
x
i
ln
(
1
+
x
)
=
x
−
1
2
x
2
+
1
3
x
3
−
⋯
=
∑
i
=
1
+
∞
(
−
1
)
i
+
1
i
x
i
\frac{1}{1-x}=1+x+x^2+\cdots=\sum_{i=0}^{+\infty}x^{i}\\ \frac{1}{1-cx^{n}}=1+cx^{n}+c^{2}x^{2n}+\cdots=\sum_{i=0}^{+\infty}c^{i}x^{in}\\ (1+x)^{n}=\binom{n}{0}+\binom{n}{1}x+\binom{n}{2}x^{2}+\cdots=\sum_{i=0}^{+\infty}\binom{n}{i}x^{i}\\ \ln\left(\frac{1}{1-x}\right)=x+\frac{1}{2}x^{2}+\frac{1}{3}x^{3}+\cdots=\sum_{i=1}^{+\infty}\frac{1}{i}x^{i}\\ \ln(1+x)=x-\frac{1}{2}x^{2}+\frac{1}{3}x^{3}-\cdots=\sum_{i=1}^{+\infty}\frac{(-1)^{i+1}}{i}x^{i}
1−x1=1+x+x2+⋯=i=0∑+∞xi1−cxn1=1+cxn+c2x2n+⋯=i=0∑+∞cixin(1+x)n=(0n)+(1n)x+(2n)x2+⋯=i=0∑+∞(in)xiln(1−x1)=x+21x2+31x3+⋯=i=1∑+∞i1xiln(1+x)=x−21x2+31x3−⋯=i=1∑+∞i(−1)i+1xi
三.多重背包计数.
我们现在给出经典的多重背包计数问题:给定一个大小为 n n n的背包以及对于每个 i i i给出体积为 i i i的物品数量 c i c_i ci,求装满背包的方案数.
经典的背包DP做法是 O ( n 2 ) O(n^2) O(n2)的,利用生成函数配合快速多项式运算我们可以做到 O ( n log n ) O(n\log n) O(nlogn).
设答案序列的生成函数为
F
(
x
)
F(x)
F(x),那么有:
F
(
x
)
=
∏
i
=
1
n
1
(
1
−
x
i
)
c
i
=
exp
(
−
∑
i
=
1
n
c
i
ln
(
1
−
x
i
)
)
F(x)=\prod_{i=1}^{n}\frac{1}{(1-x^{i})^{c_i}}\\ =\exp\left(-\sum_{i=1}^{n}c_i\ln(1-x^{i})\right)\\
F(x)=i=1∏n(1−xi)ci1=exp(−i=1∑nciln(1−xi))
设
G
i
(
x
)
=
ln
(
1
−
x
i
)
G_i(x)=\ln(1-x^{i})
Gi(x)=ln(1−xi),那么有:
G
i
(
x
)
=
ln
(
1
−
x
i
)
=
∫
(
ln
(
1
−
x
i
)
)
′
d
x
=
−
i
∫
x
i
−
1
1
−
x
i
d
x
=
−
i
∫
∑
j
=
0
+
∞
x
(
j
+
1
)
i
−
1
d
x
=
−
i
∑
j
=
1
+
∞
1
i
j
x
i
j
=
−
∑
j
=
1
+
∞
1
j
x
i
j
G_i(x)=\ln(1-x^{i})\\ =\int(\ln(1-x^{i}))'\mathrm{d}x\\ =-i\int \frac{x^{i-1}}{1-x^{i}}\mathrm{d}x\\ =-i\int \sum_{j=0}^{+\infty}x^{(j+1)i-1}\mathrm{d}x\\ =-i\sum_{j=1}^{+\infty}\frac{1}{ij}x^{ij}\\ =-\sum_{j=1}^{+\infty}\frac{1}{j}x^{ij}
Gi(x)=ln(1−xi)=∫(ln(1−xi))′dx=−i∫1−xixi−1dx=−i∫j=0∑+∞x(j+1)i−1dx=−ij=1∑+∞ij1xij=−j=1∑+∞j1xij
那么就有:
F
(
x
)
=
exp
(
−
∑
i
=
1
n
c
i
G
i
(
x
)
)
=
exp
(
∑
i
=
1
n
c
i
∑
j
=
1
+
∞
1
j
x
i
j
)
F(x)=\exp\left(-\sum_{i=1}^{n}c_iG_i(x)\right)\\ =\exp\left(\sum_{i=1}^{n}c_i\sum_{j=1}^{+\infty}\frac{1}{j}x^{ij}\right)
F(x)=exp(−i=1∑nciGi(x))=exp(i=1∑ncij=1∑+∞j1xij)
在 exp \exp exp内部的式子暴力做可以用调和级数证明复杂度为 O ( n log n ) O(n\log n) O(nlogn),多项式 exp \exp exp可以做到 O ( n log n ) O(n\log n) O(nlogn),所以总复杂度为 O ( n log n ) O(n\log n) O(nlogn).
此题即为洛谷4389付公主的背包,貌似这个东西被称为欧拉变换.
四.前缀和与差分.
我们观察差分的公式
Δ
f
i
=
f
i
−
f
i
−
1
\Delta f_i=f_{i}-f_{i-1}
Δfi=fi−fi−1,设
f
i
f_i
fi的生成函数为
F
(
x
)
F(x)
F(x),那么其差分的生成函数
Δ
F
(
x
)
\Delta F(x)
ΔF(x)即为:
Δ
F
(
x
)
=
(
1
−
x
)
F
(
x
)
\Delta F(x)=(1-x)F(x)
ΔF(x)=(1−x)F(x)
那么对于其高阶差分
Δ
k
F
(
x
)
\Delta^{k} F(x)
ΔkF(x)即为:
Δ
k
F
(
x
)
=
(
1
−
x
)
k
F
(
x
)
\Delta^{k}F(x)=(1-x)^{k}F(x)
ΔkF(x)=(1−x)kF(x)
我们发现 ( 1 − x ) k (1-x)^{k} (1−x)k的第 i i i项为 ( − 1 ) i ( k i ) x i (-1)^{i}\binom{k}{i}x^{i} (−1)i(ik)xi,那么就可以用多项式卷积实现快速高阶差分了.
我们知道差分的逆运算为前缀和,那么
F
(
x
)
F(x)
F(x)的高阶前缀和
Σ
k
F
(
x
)
\Sigma^{k}F(x)
ΣkF(x)即为:
Σ
k
F
(
x
)
=
F
(
x
)
(
1
−
x
)
k
\Sigma^{k}F(x)=\frac{F(x)}{(1-x)^{k}}
ΣkF(x)=(1−x)kF(x)
利用多项式求逆即可实现快速高阶前缀和.
当然也可以不用多项式求逆而是利用插板法,这里不再赘述.
此题即为洛谷5488差分与前缀和.
五.指数型生成函数.
指数型生成函数:定义一个无穷数列 f i f_i fi的指数型生成函数 F ( x ) = ∑ i = 0 + ∞ f i x i i ! F(x)=\sum_{i=0}^{+\infty}f_i\frac{x^{i}}{i!} F(x)=∑i=0+∞fii!xi,其中 x i i ! \frac{x^{i}}{i!} i!xi只是一个标志.
指数型生成函数有什么用呢?我们来看看它的卷积形式.
设两个数列
f
i
,
g
i
f_i,g_i
fi,gi的指数型生成函数卷积为
h
i
h_i
hi,那么有:
h
i
i
!
=
∑
j
=
0
i
f
j
j
!
g
i
−
j
(
i
−
j
)
!
h
i
=
i
!
∑
j
=
0
i
f
j
g
i
−
j
1
j
!
(
i
−
j
)
!
h
i
=
∑
j
=
0
i
(
i
j
)
f
j
g
i
−
j
\frac{h_i}{i!}=\sum_{j=0}^{i}\frac{f_j}{j!}\frac{g_{i-j}}{(i-j)!}\\ h_i=i!\sum_{j=0}^{i}f_jg_{i-j}\frac{1}{j!(i-j)!}\\ h_i=\sum_{j=0}^{i}\binom{i}{j}f_jg_{i-j}
i!hi=j=0∑ij!fj(i−j)!gi−jhi=i!j=0∑ifjgi−jj!(i−j)!1hi=j=0∑i(ji)fjgi−j
我们发现指数型生成函数的卷积相对于普通型生成函数的卷积多了一个组合数作为系数,而在有标号的计数中往往出现的是这种形式的卷积.
六.常见的指数型生成函数.
常见的指数型生成函数有:
e
c
x
=
1
+
c
x
+
c
2
x
2
2
+
c
3
x
3
6
⋯
=
∑
i
=
0
+
∞
c
i
x
i
i
!
sinh
(
c
x
)
=
e
c
x
−
e
−
c
x
2
=
c
x
+
c
3
x
3
6
+
c
5
x
5
120
+
⋯
=
∑
i
=
0
+
∞
c
2
i
+
1
x
2
i
+
1
(
2
i
+
1
)
!
cosh
(
c
x
)
=
e
c
x
+
e
−
c
x
2
=
1
+
c
2
x
2
2
+
c
4
x
4
24
+
⋯
=
∑
i
=
0
+
∞
c
2
i
x
2
i
(
2
i
)
!
sin
(
c
x
)
=
e
i
x
−
e
−
i
x
2
i
=
c
x
−
c
3
x
3
6
+
c
5
x
5
120
−
⋯
=
∑
i
=
0
+
∞
(
−
1
)
i
c
2
i
+
1
x
2
i
+
1
(
2
i
+
1
)
!
cos
(
c
x
)
=
e
i
x
+
e
−
i
x
2
=
1
−
c
2
x
2
2
+
c
4
x
4
24
−
⋯
=
∑
i
=
0
+
∞
(
−
1
)
i
c
2
i
x
2
i
(
2
i
)
!
(
1
+
x
)
n
=
1
+
n
x
+
n
2
‾
x
2
2
+
n
3
‾
x
3
6
+
⋯
=
∑
i
=
0
+
∞
n
i
‾
x
i
i
!
e^{cx}=1+cx+c^{2}\frac{x^{2}}{2}+c^{3}\frac{x^{3}}{6}\cdots=\sum_{i=0}^{+\infty}c^{i}\frac{x^{i}}{i!}\\ \sinh(cx)=\frac{e^{cx}-e^{-cx}}{2}=cx+c^{3}\frac{x^{3}}{6}+c^{5}\frac{x^{5}}{120}+\cdots=\sum_{i=0}^{+\infty}c^{2i+1}\frac{x^{2i+1}}{(2i+1)!}\\ \cosh(cx)=\frac{e^{cx}+e^{-cx}}{2}=1+c^{2}\frac{x^{2}}{2}+c^{4}\frac{x^{4}}{24}+\cdots=\sum_{i=0}^{+\infty}c^{2i}\frac{x^{2i}}{(2i)!}\\ \sin(cx)=\frac{e^{ix}-e^{-ix}}{2i}=cx-c^{3}\frac{x^{3}}{6}+c^{5}\frac{x^{5}}{120}-\cdots=\sum_{i=0}^{+\infty}(-1)^{i}c^{2i+1}\frac{x^{2i+1}}{(2i+1)!}\\ \cos(cx)=\frac{e^{ix}+e^{-ix}}{2}=1-c^{2}\frac{x^{2}}{2}+c^{4}\frac{x^{4}}{24}-\cdots=\sum_{i=0}^{+\infty}(-1)^{i}c^{2i}\frac{x^{2i}}{(2i)!}\\ (1+x)^{n}=1+nx+n^{\underline{2}}\frac{x^{2}}{2}+n^{\underline{3}}\frac{x^{3}}{6}+\cdots=\sum_{i=0}^{+\infty}n^{\underline{i}}\frac{x^{i}}{i!}
ecx=1+cx+c22x2+c36x3⋯=i=0∑+∞cii!xisinh(cx)=2ecx−e−cx=cx+c36x3+c5120x5+⋯=i=0∑+∞c2i+1(2i+1)!x2i+1cosh(cx)=2ecx+e−cx=1+c22x2+c424x4+⋯=i=0∑+∞c2i(2i)!x2isin(cx)=2ieix−e−ix=cx−c36x3+c5120x5−⋯=i=0∑+∞(−1)ic2i+1(2i+1)!x2i+1cos(cx)=2eix+e−ix=1−c22x2+c424x4−⋯=i=0∑+∞(−1)ic2i(2i)!x2i(1+x)n=1+nx+n22x2+n36x3+⋯=i=0∑+∞nii!xi
七.指数型生成函数与多项式ln,exp.
对于一个多项式
F
(
x
)
F(x)
F(x),我们有:
exp
F
(
x
)
=
∑
i
=
0
+
∞
F
i
(
x
)
i
!
\exp F(x)=\sum_{i=0}^{+\infty}\frac{F^{i}(x)}{i!}
expF(x)=i=0∑+∞i!Fi(x)
这个式子在图计数中非常常用,因为设 F ( x ) F(x) F(x)是满足某种条件的有标号无向连通图的方案数的指数型生成函数,那么 exp F ( x ) \exp F(x) expF(x)就是满足同样条件的有标号无向图的方案数的指数型生成函数.
举个例子,我们现在要求 n n n个点无重边无自环的无向连通图数量 f n f_n fn.
我们发现
f
n
f_n
fn不好求,但是
n
n
n个点无重边无自环的无向图数量
g
n
g_n
gn很好求,因为:
g
n
=
2
(
n
2
)
g_n=2^{\binom{n}{2}}
gn=2(2n)
设
f
,
g
f,g
f,g的指数型生成函数为
F
(
x
)
,
G
(
x
)
F(x),G(x)
F(x),G(x),那么有:
G
(
x
)
=
exp
F
(
x
)
⇔
F
(
x
)
=
ln
G
(
x
)
G(x)=\exp F(x)\Leftrightarrow F(x)=\ln G(x)
G(x)=expF(x)⇔F(x)=lnG(x)
利用多项式 ln \ln ln就可以在 O ( n log n ) O(n\log n) O(nlogn)的时间复杂度内求解了.
此题即为BZOJ3456城市规划.