学习笔记:生成函数I
形式幂级数
多项式与形式幂级数
- 多项式:\(A(x) = \sum_{i = 0}^na_ix^i\)。
- 形式幂级数:\(A(x) = \sum_{i \ge 0}a_ix^i\)。
其中 \(a_i \in K\),\(K\) 是一个域,通常考虑 \(K = \mathbb{R}\) 或 \(K = \mathbb{Z}_{p}\)。
注意这里的 \(x\) 可以理解为独立于域 \(K\) 的一个符号。
形式幂级数的运算
设 \(A(x) = \sum_{i \ge 0} a_ix^i, \ B(x) = \sum_{i \ge 0} b_ix^i\)。
- 加法:\(A(x) + B(x) = \sum_{i \ge 0} (a_i + b_i)x^i\)。
- 减法:\(A(x) - B(x) = \sum_{i \ge 0} (a_i - b_i)x^i\)。
- 乘法:\(A(x)\times B(x) = \sum_{k \ge 0} (\sum_{i = 0}^ka_i b_{k - i})x^k\)。
可以验证,形式幂级数在以上定义的 \(+, -, \times\) 下形成一个环。
记号:记形式幂级数(或多项式)\(A(x)\) 的 \(x^n\) 项的系数为 \([x^n]A(x)\)。
形式幂级数的逆元
-
形式幂级数的逆元:\(A(x)B(x) = 1\)。
-
逆元存在的条件:\([x^0]A(x) \neq 0\)。
-
暴力计算的方法:递推。
设 \(A(x) = a_0 + a_1x + a_2x^2 +\cdots, \ B(x) = b_0 + b_1x + b_2x^2 + \cdots\)。
则 \(A(x)B(x) = a_0b_0 + (a_0b_1 + a_1b_0)x + \cdots + (a_0b_n + a_1b_{n - 1} + \cdots + a_nb_0)x^n + \cdots\)。
\(A(x)B(x) = 1\) 当且仅当
\[\begin{cases} a_0b_0 = 1\\ a_0b_1 + a_1b_0 = 0\\ \vdots\\ a_0b_n + a_1b_{n - 1} + \cdots + a_nb_0 = 0\\ \vdots \end{cases} \]所以 \(b_0 = a_0^{-1}\),\(b_n = (a_1b_{n - 1} +\cdots+ a_nb_0) \cdot a_0^{-1}\)。
常见的逆
-
\(A(x) = 1 + x + x^2 + \cdots\) 和 \(B(x) = 1 - x\),即 \(A(x) = \dfrac{1}{1 - x}\)。
-
\(A(x) = 1 + ax + a^2x^2 + \cdots\) 和 \(B(x) = 1 - ax\),即 \(A(x) = \dfrac{1}{1 - ax}\)。
-
\(A(x) = 1 + f(x) + f^2(x) + \cdots\) 和 \(B(x) = 1 - f(x)\),即 \(A(x) = \dfrac{1}{1 - f(x)}\)。
-
\(A(x) = {k - 1\choose 0} + {k \choose1}x + {k + 1\choose2}x^2 + \cdots\) 和 \(B(x) = (1 - x)^k\),即 \(A(x) = \dfrac{1}{(1 - x)^k}\)。
\(A(x) = (1 + x + x^2 + \cdots)^k = \dfrac{1}{(1 - x)^k}\)。
即不定方程 \(x_1 + x_2 + \cdots+ x_k = n, \ \forall x_i \ge0\) 的常生成函数。
同时,我们知道该方程的解的数量为 \(n + k - 1\choose k - 1\)。
所以有 \([x^n]A(x) = {n + k - 1\choose k - 1} = {n + k - 1\choose n}\)。
常生成函数(Ordinary Generating Function)
定义
一个数列 \(\{a_n\}\) 对应的常生成函数为 \(A(x) = \sum_{n \ge 0} a_nx^n\)。
-
两种物体,其中取 \(i\) 个第 \(1\) 种物体的方案数为 \(a_i\),取 \(j\) 个第 \(2\) 种物体的方案数为 \(b_i\),求取 \(k\) 个物体的方案数 \(c_k\)。
\[C(x) = \sum_{k \ge 0} c_k = \sum_{k \ge 0} \sum_{i = 0}^ka_ib_{k - i} = A(x) B(x) \]所以 \(c_k = [x^k](A(x)B(x))\)。
-
取 \(n\) 个水果,苹果个数必须是偶数,香蕉个数必须是 \(3\) 的倍数,草莓个数不超过 \(5\),求方案数。
令 \(a_i\) 为取 \(i\) 个苹果的方案数,则 \(a = \{1, 0, 1, 0, 1\cdots\}\)。
所以
- \(A(x) = 1 + x^2 + x^4 + \cdots\)。
- \(B(x) = 1 + x^3 + x^6 + \cdots\)。
- \(C(x) = 1 + x^2 + x^3 + x^4 + x^5\)。
取 \(n\) 个水果的方案为 \(A(x)B(x)C(x)\) 第 \(x^n\) 项的系数。
可以先 \(O(n^2)\) 求 \(A(x)\) 与 \(B(x)\) 乘积的前 \(n\) 项,再 \(O(n^2)\) 求 \(A(x)B(x)\) 与 \(C(x)\) 乘积的前 \(n\) 项。
不定方程的解的数量
求不定方程 \(x_1 + x_2 = n\) 的解的数量,其中 \(l_1 \le x_1 \le r_1, \ l_2 \le x_2 \le r_2\)。
令数列 \(\{a_n\}\) 表示 \(x_1 = n\) 的解的数量,则 \(\forall n \in [l_1, r_1], \ a_n = 1\)。
那么 \(\{a_n\}\) 的常生成函数 \(F_1(x) = \sum_{i = l_1}^{r_1} x^i\)。
所以解的数量为 \([x^n] (F_1(x)F_2(x))\)。
同理,推广到 \(k\) 元不定方程,解的数量为 \([x^n](\prod F_i(x))\) 。
拓展:求 \(x_1 + 2x_2 + 3x_3 = n\) 的正整数解个数。
\(F_1(x) = \sum_{n \ge 1} x^n = x + x^2 + x^3 + \cdots\)。
\(F_2(x) = \sum\limits_{n \ge 1, \ 2 \mid n} x^n = x^2 + x^4 + x^6 + \cdots\)。
\(F_3(x) = \sum\limits_{n \ge 1, \ 3 \mid n} x^n = x^3 + x^6 + x^9 + \cdots\)。
相乘即可。
定理
设 \(S = \{a_1, a_2, a_3, \dots a_k\}\),且 \(a_i\) 可以取的次数集合为 \(M_i\),记 \(F_i = \sum\limits_{u \in M_i}x^u\),则从 \(S\) 中取 \(n\) 个元素的方案 \(g(n)\) 的常生成函数 \(G(x) = \sum_{i \ge 0}g(i)x^i\),满足
递推关系
-
斐波那契数列满足 \(a_0 = 0, a_1 = 1, a_2 = 1, a_n = a_{n - 1} + a_{n - 2}\),求其常生成函数。
\[\begin{aligned} \\ A(x) &= a_0 + a_1x + a_2x^2 + a_3x^3 +\cdots\\ \\ &= a_0 + a_1x + (a_0 + a_1)x^2 + (a_1 + a_2)x^3 + \cdots\\ \\ &= x + (a_0x^2 + a_1x^3 + \cdots) + (a_1x^2 + a_2x^3 + \cdots)\\ \\ &= x + xA(x) + x^2A(x) \end{aligned} \]所以 \(A(x) = \dfrac{x}{1 - x - x^2}\)。
-
利用常生成函数,求解斐波那契通项公式。
\[\begin{aligned} A(x) &= \dfrac{x}{1 - x - x^2}\\ \\ &= x(\dfrac{c}{1 - ax} + \dfrac{d}{1 - bx})\\ \\ &= cx(1 + ax + a^2x^2 + \cdots) + dx(1 + bx + b^2x^2 + \cdots)\\ \\ &= \sum_{n \ge 1} (a^{n - 1}c + b^{n - 1}d) x^n \end{aligned} \]待定系数解得
\[\begin{cases} a = \dfrac{1 + \sqrt 5}{2} \\ b = \dfrac{1 - \sqrt 5}{2} \\ c = \dfrac{1}{\sqrt 5} \times \dfrac{1 + \sqrt 5}{2} \\ d = \dfrac{1}{\sqrt 5} \times \dfrac{1 - \sqrt 5}{2} \end{cases} \]所以
\[\begin{aligned} &\left[x^0\right] A(x)= 0\\ &\left[x^n\right] A(x) = \dfrac{1}{\sqrt 5}[(\dfrac{1 - \sqrt 5}{2})^n + (\dfrac{1 + \sqrt 5}{2})^n] \end{aligned} \] -
假设数列 \(\{a_n\}\) 存在递推关系 \(a_n = c_1a_{n - 1} + c_2a_{n - 2} + \cdots + c_ka_{n - k}\),求其常生成函数。
\[\begin{aligned} A(x) &= a_0 + a_1x + \cdots + a_{k - 1}x^{k - 1} + \sum_{n \ge k}(c_1a_{n - 1} +\cdots + c_ka_{n - k})x^n\\ \\ &= a_0 + \cdots + a_{k - 1}x^{k - 1} + c_1x(A(x) -\sum_{i \le k - 2}a_ix^i) + c_2x^2(A(x) - \sum_{i \le n - 3}a_ix^i) + \cdots + c_kx^kA(x)\\ \\ &= (c_1x + \cdots + ck_x^k)A(x) + B(x) \end{aligned} \]\(A(x)\) 可以表示为 \(\dfrac{B(x)}{1 - (c_1x + \cdots + ck_x^k)}\)。
若想将 \(A(x)\) 还原为 \(\sum a_ix^i\) 的形式,待定系数 \(A(x) = B(x) \sum \dfrac{v_i}{1 - u_ix}\)。
例题
A-背包
那么 \([x^n]G(x) = [x^{n - 1}]\dfrac{1}{(1 - x)^4} = \begin{pmatrix}n + 2\\ 3\end{pmatrix} = \dfrac{n(n + 1)(n + 2)}{6}\)。
CF451E
题意:\(n\) 种花,分别 \(f_1, f_2\dots,f_n\) 个,求取 \(s\) 朵花的方案数,\(n \le 20, s \le 10^{18}\)。
不妨令 \(F(x) = \prod (1 - x^{f_i + 1})\)。
则
\(n\) 很小,暴力展开 \(F(x)\) 的系数。
P6078 [CEOI2004] Sweets
题意:\(n\) 种糖,分别 \(m_1, m_2\dots,m_n\) 个,求吃至少 \(a\),不多于 \(b\) 的方案数 ,\(n \le 10, a \le 10^7\)。
\(F(x) = \prod (1 - x^{m_i + 1})\)。
引理:\(\sum_{i = a}^b\begin{pmatrix}i\\j\end{pmatrix} = \begin{pmatrix} b + 1\\ j + 1\end{pmatrix} - \begin{pmatrix} a\\ j + 1\end{pmatrix}\)。
证明:
其中
所以 \(\sum_{i = a}^b\begin{pmatrix}i\\j\end{pmatrix} = \begin{pmatrix} b + 1\\ j + 1\end{pmatrix} - \begin{pmatrix} a\\ j + 1\end{pmatrix}\)。
所以原问题答案为
题目模数 \(P = 2004\) 不好处理。
对于模数非质数的除法,可以先把模数乘上除数,再将运算结果除以除数得到答案。
不妨先令答案乘上 \(n!\),同时 \(P \leftarrow P \cdot n!\),最后再除以 \(n!\)。
指数生成函数(Exponential Generating Function)
定义
一个数列 \(\{a_n\}\) 的指数生成函数为 \(A(x) = \sum\limits_{n \ge 0}a_n\dfrac{x^n}{n!}\)。
对于 \(\{a_n\} = \{1, 1, 1, \cdots\}\),\(A(x) = 1 + \dfrac{x}{1!} + \dfrac{x^2}{2!} + \dfrac{x^3}{3!} + \cdots = e^x = \exp (x)\)。
-
两种物体,其中取 \(i\) 个第 \(1\) 种物体的方案数为 \(a_i\),取 \(j\) 个第 \(2\) 种物体的方案数为 \(b_i\),求取 \(k\) 个物体并排成一排的方案数 \(c_k\)。
\(c_k = \sum\limits_{i = 0}^k a_ib_{k - i}\dfrac{k!}{i!(k - i !)}\)。
\(C(x) = \sum\limits_{k \ge 0} \dfrac{c_k}{k!} = \sum\limits_{k \ge 0}\sum\limits_{i = 0}^k \dfrac{a_i}{i!}\cdot \dfrac{b_{k - i}}{(k - i !)} = A(x) B(x)\)。
-
用 \(1, 2, 3, 4\) 组成 \(6\) 位数,每个数字出现次数不得大于 \(2\),求不同的六位数个数。
\(\{a\} = \{1, 1, 1, 0, 0 \cdots\}, \ F(x) = 1 + \dfrac{x}{1!} + \dfrac{x^2}{2!}\)。
\(G(x) = F^4(x)\)。
则不同的六位数个数为 \(6! [x^6]G(x)\)。
定理
设 \(S = \{a_1, a_2, a_3, \dots a_k\}\),且 \(a_i\) 可以取的次数集合为 \(M_i\),记 \(F_i = \sum\limits_{u \in M_i}x^u\),则从 \(S\) 中取 \(n\) 个元素排成一排的方案 \(g(n)\) 的指数生成函数 \(G(x) = \sum_{i \ge 0}g(i)\dfrac{x^i}{i!}\),满足
公式(定义)
- \(\exp(x) = 1 + \dfrac{x}{1!} + \dfrac{x^2}{2!} + \cdots = \sum_{n \ge 0}\dfrac{x^n}{n!}\)。
- \(\exp(ax) = 1 + \dfrac{ax}{1!} + \dfrac{a^2x^2}{2!} + \cdots = \sum_{n \ge 0}\dfrac{a^nx^n}{n!}\)。
- \(\exp(f(x)) = 1 + \dfrac{f(x)}{1!} + \dfrac{f^2(x)}{2!} + \cdots = \sum_{n \ge 0}\dfrac{f^n(x)}{n!}\)。
- \(\dfrac{\exp(x) + \exp(-x)}{2} = \sum_{n \ge 0} [2 \mid n] \dfrac{x^n}{n!}\)。
- \(\dfrac{\exp(x) - \exp(-x)}{2} = \sum_{n \ge 0} [2 \nmid n] \dfrac{x^n}{n!}\)。
例题
POJ3734
题意:\(n\) 个格子排成一列,每个格子可以被涂成红、黄、蓝或绿,偶数个格子是红和绿,求方案数。
CF891E
题意: \(n\) 个数,\(k\) 次操作,每次随机选择一个数 \(x \in [1,n]\),把 \(a_x\) 减一,并将答案增加除 \(a_x\) 外所有数的乘积。
求最终答案的期望,对 \(10^9 + 7\) 取模。
第一次操作对答案的贡献为
以此类推,当前轮的贡献为当前所有数之积减去下一轮所有数之积。
最终结果可以表示为 \(\prod a_i - \prod(a_i - x_i)\),\(x_i\) 为 \(i\) 被操作的次数。
所以后项的期望值
令 \(F_i(x) = \sum_{j \ge 0} \dfrac{a_i - j}{j!}x^j\)。
则
设 \(G(x) = \prod(a_i - x)\)。
那么
由于 \(i > n\) 时 \(G(x)\) 系数为 \(0\),所以枚举到 \(\min(n, k)\) 即可。
Catalan 数
推导
\(n + 1\) 个数相乘 \(x_0x_1x_2\cdots x_n\),求其结合顺序的方案数。如 \(n = 3\) 时,有 \(5\) 种方案:
枚举最后一步在哪划分,得到递推式
考虑其生成函数
则 \(C(x) = \dfrac{1 \pm \sqrt{1 - 4x}}{2x}\)。
若满足 \(g^2(x) = f(x)\),则 \([x^0]g(x) > 0\) 的记作 \(\sqrt {f(x)}\),\([x^0]g(x) < 0\) 的记作 \(-\sqrt {f(x)}\)。
由于 \(4x\) 不存在逆元(常数项为 \(0\)),必然被分子约掉。
而分子上如果取正号,则常数项不为 \(0\),不能约去常数项为 \(0\) 的式子。
所以 \(C(x) = \dfrac{1 - \sqrt{1 - 4x}}{2x}\)。
利用广义二项式定理,展开
广义组合数:\(\alpha \in \mathbb{R}, \ \begin{pmatrix}\alpha\\0\end{pmatrix} = 1,\ \begin{pmatrix}\alpha\\k\end{pmatrix} = \dfrac{\alpha(\alpha - 1) \cdots(\alpha - k + 1)}{k!}\)。
广义二项式定理:\((x + y)^\alpha = \sum\limits_{k = 0}^{+\infty}\begin{pmatrix}\alpha\\k\end{pmatrix}x^{\alpha - k}y^k\)。
可以推出卡特兰数的通项公式