生成函数学习笔记
幂级数
定义
定义一个 形式幂级数 (以下简称幂级数) 为形如
的表达式,其中 \(a_n\) 是具体的数,而 \(x\) 是一个形式符号。序列 \(\{a_n\}\) 为其系数序列,称两个幂级数相等当且仅当它们的系数序列相同。
为简便,一般记 \([x^n]f(x)\) 表示幂级数 \(f(x) = \sum_{n \geq 0} a_n x^n\) 的 \(n\) 次项系数 \(a_n\) 。
多项式可被视为一个特殊的幂级数:它的幂级数从某一项开始都为 \(0\)。
四则运算
与普通多项式运算法则相同。
可以验证,幂级数仍然满足常见的实数域运算律。
定义一个幂级数 \(f\) 的逆元为 \(f^{-1}\) ,即满足 \(fg = 1\) 的 \(g\)。定义幂级数的除法 \(\dfrac{f}{g} = f g^{-1}\) 。
可以证明,若 \(f\) 的 \(0\) 次项为 \(0\) ,则 \(f\) 不存在逆元,否则 \(f\) 的逆元 \(f^{-1}\) 存在且唯一。
例如
基本运算
幂级数的级数
考虑对幂级数进行无限求和,即 \(\sum_{i \geq 0} f_i(x)\),其中每个 \(f_i(x)\) 都为一个幂级数。
当 \(f_i(x)\) 的最低次项严格递增时,\(\sum_{i \geq 0} f_i(x)\) 有定义。
幂级数的复合
设 \(f,g\) 为幂级数,满足 \(f\) 是多项式或 \(g(0) = 0\) (即 \([x^0]g(x) = 0\)),定义 \(f,g\) 的复合 \(f(g(x))\) 为
当 \(f\) 为多项式时,这是有限个幂级数求和;当 \(g(0) = 0\) 时, \(g(x)^n\) 的最低次项为 \(n\)。
幂级数的 ln 与 exp
\(exp(x),ln(1+x)\) 为两个幂级数,定义为:
可以验证:\(\exp(\ln(f(x))) = f(x)\) (\(f(0) = 1\)),\(\ln(\exp(f(x))) = f(x)\) (\(f(0) = 0\));实数域上 ln 和 exp 的运算规律仍然满足。
普通生成函数(OGF)
定义
定义序列 \(a\) 的 普通生成函数(OGF) \(f(x)\) 为幂级数
两个数列相加减,它们的 OGF 相加减;
两个数列做卷积,它们的 OGF 相乘。
封闭形式
使用生成函数时,一般会化成封闭形式以便更好化简。
例如:\(\langle 1,1,1,\ldots \rangle\) 的 OGF \(f(x) = \sum_{n \geq 0} x^n\) ,注意到 \(f(x) = x f(x) + 1\),解该方程,得
这就是 \(f(x) = \sum_{n \geq 0} x^n\) 的封闭形式。
一些常见的数列的生成函数:
-
\[a = \langle 1,1,1,\ldots \rangle , f(x) = \sum_{n \geq 0} x^n = \dfrac{1}{1-x} \]
-
\[a = \langle 1,0,1,0,1,0, \ldots \rangle , f(x) = \sum_{n \geq 0} x^{2n} = \dfrac{1}{1-x^2} \]
-
\[a = \langle 1,2,3,4, \ldots \rangle , f(x) = \sum_{n \geq 0} (n+1) x^n = \dfrac{1}{(1-x)^2} \]
-
\[a = \langle 1,p,p^2,p^3, \ldots \rangle , f(x) = \sum_{n \geq 0} p^n x^n = \dfrac{1}{1-px} \]
-
\[a_n = {m \choose n} , f(x) = \sum_{n \geq 0} {m \choose n} x^n = (1+x)^m \]
-
\[a_n = {m+n \choose n} , f(x) = \sum_{n \geq 0} {m+n \choose n} x^n = \dfrac{1}{(1-x)^{m+1}} \]
求解线性递推
例:已知 \(a_0,a_1\) 为常数,\(a_n = 2a_{n-1} + 3a_{n-2}\) ,求 \(a\) 的通项公式。
解:设 \(a\) 的 OGF 为 \(f(x) = \sum_{n \geq 0} a_n x^n\),则:
解得
不妨设
其中 \(A,B\) 不难由通过比较系数求得。
又因为
因此 \([x^n]f(x) = A \times (-1)^n + B \times 3^n\) 。
对于任意多项式 \(F(x),G(x)\),都可以用类似上面的方法求出生成函数 \(\dfrac{F(x)}{G(x)}\) 的展开式,实际运用中,一般先求出 \(G(x)\) 的根,将分母表示成 \(\prod (1 - p_ix)^{d_i}\) 的形式,然后求比较系数求分子,特别地,若 \(G(x)\) 存在重根,则每有一个重根则需多设一个分式。
例题
抽奖机
有一个抽奖机。当按下按钮时,抽奖机有 \(p\) 的概率掉出一个盲盒,\(1 − p\) 的概率关机。每个盲盒有一半的概率有奖品,一半的概率为空盲盒。
小 A 现在不断地按下按钮直到抽奖机关机。对 \(0\leq k \leq K\) 求出小 A 最后恰好得到 \(k\) 个奖品的概率。 \(K \leq 10^5\)。
抽到 \(k\) 个奖品的概率即为:
P10780 食物
- 承德汉堡:偶数个;
- 可乐:\(0\) 个或 \(1\) 个;
- 鸡腿:\(0\) 个,\(1\) 个或 \(2\) 个;
- 蜜桃多:奇数个;
- 鸡块:\(4\) 的倍数个;
- 包子:\(0\) 个,\(1\) 个,\(2\) 个或 \(3\) 个;
- 土豆片炒肉:不超过一个;
- 面包:\(3\) 的倍数个;
计算携带 \(n\) 件物品的方案数,并对 \(10007\) 取模。\(1\leq n\leq 10^{500}\);
首先计算每种食物的生成函数:
- 承德汉堡:\(1+x^2+x^4 + \ldots = \dfrac{1}{1-x^2}\)
- 可乐:\(1+x\)
- 鸡腿:\(1+x+x^2 = \dfrac{1-x^3}{1-x}\)
- 蜜桃多 \(x+x^3+x^5 + \ldots = \dfrac{x}{1-x^2}\)
- 鸡块:\(1+x^4+x^8+\ldots = \dfrac{1}{1-x^4}\);
- 包子:\(1+x+x^2+x^3 = \dfrac{1-x^4}{1-x}\)
- 土豆片炒肉:\(1+x\)
- 面包:\(1+x^3+x^6+ \ldots = \dfrac{1}{1-x^3}\)
把这一堆东西乘起来,得到总的生成函数 \(f(x) = \dfrac{x}{(1-x)^4} = \sum_{n \geq 0} {n+4-1 \choose n} x^{n+1}\) 。
因此 \([x^n]f(x) = {(n-1)+4-1 \choose (n-1)} = {n+2 \choose 3}\) 。
整数拆分问题
设 \(p_n\) 表示将正整数 \(n\) 拆成若干个可以相同的正整数之和的方案数(只关心每个数出现的次数,不关心顺序),求 \(p_1,p_2,\ldots,p_n\)。\(n \leq 10^5\)。
不加证明地,我们给出五边形数定理:
其中,形如 $ \dfrac{k(3k \pm 1)}{2}$ 的数被称为广义五边形数。
不难看出,在 \(\prod_{i \geq 1} (1-x^i)\) 的系数序列前 \(n\) 项中,仅有 \(\Theta(\sqrt{n})\) 项非零。
设 \(f(x) = \sum_{n \geq 0} p_nx^n\),则
因此 $f(x)\prod_{i \geq 1}(1-x^i) = f(x) (1 + \sum_{k \geq 1} (-1)^k x^{\frac{k(3k \pm 1)}{2}}) = 1 $ 。即
通过展开并比较 \(x^n\) 的系数,可得 $p_n - p_{n-1} - p_{n-2} + p_{n-5} + p_{n-7} - \ldots = 0 $。
又由于广义五边形数是 \(\Theta(\sqrt{n})\) 的,因此求出前 \(n\) 项的总时间复杂度为 \(\Theta(n \sqrt{n})\) 。
区间背包/可回退背包
有 \(n\) 个物品,第 \(i\) 个物品的重量为 \(w_i\)。有两个指针 \(1 \leq l \leq r \leq n\)。你要维护两种操作:
- 移动 \(l\) 或 \(r\) 指针一步。
- 问 \([l,r]\) 之间的物品是否能凑出重量 \(s\)。
$ n, q \leq 2 \times 10^5 $ ,\(s,w_i \leq W = 100\)。
首先,每个背包都可以被视为一个 OGF,在 OGF 的角度上,本题即为要求维护 $f(x) = \prod_{i=l}^{r} (1 +x^{w_i}) $ 的前 \(W\) 位。
加入物品 \(i\),可以视为乘上一个 \(1+ x^{w_i}\),反过来,移除物品 \(i\) 即为除掉 \(1+ x^{w_i}\) 。注意到运算时 \(1+ x^{w_i}\) 只有 \(2\) 位,而又只需要求出多项式的前 \(W\) 位信息,因此都可以做到 \(\Theta(W)\)。
指数生成函数(EGF)
定义
定义序列 \(a\) 的 指数生成函数(EGF) \(\hat{f}(x)\) 为幂级数
两个数列相加减,它们的 EGF 相加减;
两个数列做如下卷积:
,则 \(c\) 的 EGF 是 \(a,b\) 的 EGF 的乘积。
无序组合与有序组合
无序组合
对于 A,B 两类物品,从中选出若干个物品,定义一种方案的权值是选出的所有物品权值乘积。对于每个 \(n\),求选 \(n\) 个物品的所有方案权值和。
假设已经求出了 \(a_i\) 表示从 A 中选 \(i\) 个物品的所有方案权值和,\(b_j\) 表示从 B 中选 \(j\) 个物品的所有方案权值和。
此时, \(ans_n = \sum_{i=0}^n a_i b_{n-i}\)。因此 \(ans\) 的 OGF 为 \(a,b\) 的 \(OGF\) 的乘积:
有序组合
对于 A,B 两类物品,从中选出若干个物品并安排顺序,定义一种方案的权值是选出的所有物品权值乘积。对于每个 \(n\),求选 \(n\) 个物品并安排顺序的所有方案权值和。
假设已经求出了 \(a_i\) 表示从 A 中选 \(i\) 个物品并安排顺序的所有方案权值和,\(b_j\) 表示从 B 中选 \(j\) 个物品并安排顺序的所有方案权值和。
此时, \(ans_n = \sum_{i=0}^n {i\choose n} a_i b_{n-i}\)。因此 \(ans\) 的 EGF 为 \(a,b\) 的 \(EGF\) 的乘积:
类似地,若有 \(k\) 类物品,情况类似。
若选出若干物品,则
对应 OGF 的乘积。
若选出若干物品并安排顺序,则
对应 EGF 的乘积。
分组模型
有 \(n\) 个不同的元素,要将它们分到 \(k\) 个不同的组中。如果当第 \(j\) 个组分到 \(i_j\) 个元素时,会有贡献 \(a_{j,i_j}\),而一种分组方案的贡献是每个组的贡献乘积,那么所有分组方案的贡献和为
这与刚刚有序组合问题的答案相一致,因此,该问题同样可看作 \(k\) 个组的 EGF 相乘再取 \(n\) 次项系数。
特别地,如果组的数量不再给定,而是任意;忽略组的编号,只关心两个元素是否在同一个组;每个组的 EGF 都相同,记为 \(\hat{A}(x)\),那么所求即为
例题
有标号生成树计数
给定一个森林,由 \(k\) 个大小分别为 \(s_{1},s_{2},\ldots, s_k\) 的树构成,再连 \(k − 1\) 条边整张图连成一棵树,求能得到多少棵不同的有标号树。
前置知识:prufer 序列。
所有点集为 \(\{1,2,\ldots,n\}\) 的树与所有长度为 \(n − 2\)、值域为 \(\{1,2,\ldots,n\}\) 的数列一一对应。所以总共有 \(n^{n−2}\) 棵大小为 \(n\) 的有标号生成树。
我们将一棵树对应的数列称为该树的 prufer 序列。如果一个点在树上的度数为 \(d\),那么它在 prufer 序列中出现 \(d − 1\) 次。
考虑将每个连通块当成一个大点,那么需要连 \(k − 1\) 条边让这 \(k\) 个大点构成一棵树,这 \(k\) 个大点构成的树会对应一个长度为 \(k − 2\),值域为 \([1, k]\) 的 prufer 序列。如果这个 prufer 序列确定了,连边的方案数就是 \(\prod_{i=1}^{k} s_i^{d_i}\) ,其中 \(d_i\) 为第 \(i\) 个大点的度数(即 prufer 序列中出现的次数加一)。这相当于将 prufer 序列上的每一个位置分配一个连通块,此时,若第 \(i\) 个连通块被分配给了 \(x\) 个位置,那么贡献会乘上 \(s_i^{x+1}\)。
不难发现这即为分组模型一,因此结果即为所有连通块的 EGF 之积:
该结论也被称为扩展 Cayley 公式。
错排数计数
求 $\forall i \in [1,n],p_i \neq i $ 的长度为 \(n\) 的排列数。
排列可以被视为若干个置换环,错排则可以被视为若干个大小不为 \(1\) 的置换环。原问题即可看作将 \(1,2,\ldots,n\) 分成若干个环,每个环的大小 \(i\) 满足 \(i \geq 2\),贡献为 $(i-1)! $(环内圆排列方案数),由此可得,一个这样的环的 EGF 为
可以发现,此时我们的问题与分组模型二相似,因此错排的 EGF 即为
UVA1305 Chocolate
有一个长度为 \(n\) 的数列 \(a\),每一位都在 \({1,2,\ldots,c}\) 里均匀随机生成,问有多少个可能的 \(a\),使得恰好有 \(m\) 个 \(x\) 满足 \(x\) 在数列中出现奇数次。\(n,m \leq 10^6,c \leq 10\) 。
显然可以令 \(m \gets \min(n,c)\) 。考虑每种颜色对应的 EGF,若它出现奇数次,则它的 EGF
若它出现偶数次,则它的 EGF
最终答案即为 \(n! {c \choose m} [x^n](\dfrac{e^x - e^{-x}}{2})^m (\dfrac{e^x + e^{-x}}{2})^{c-m}\) 。
又因为
因此,最终答案为 $n! {c \choose m} 2^{-c} \sum_{i=0}^{m} \sum_{j=0}^{c-m} (-1)^i {m \choose i} {c-m \choose j} \dfrac{(c-2i-2j)^n}{n!} $ 。

我是课件搬运工。
浙公网安备 33010602011771号