前置知识
组合数公式
二项式定理
\[(a+b)^n=\sum_{k=0}^{n}\dbinom{n}{k}a^{n-k}b^k
\]
多项式定理
多项式 \(\left(\sum_{i=1}^{n}x_i\right)^m\) 的展开式中 \(\prod_{i=1}^{n}x_i^{p_i}\) 项的系数为
\[\dfrac{n!}{\prod_{i=1}^{n}p_i!}
\]
其中 \(\sum_{i=1}^{n}p_i=m\)。
广义二项式定理
广义二项式系数
\[\dbinom{\alpha}{k}=\dfrac{\prod_{i=0}^{k-1}(\alpha-i)}{k!},\alpha\in\mathbb{R},k\in\mathbb{N}
\]
广义二项式定理
\[(x+y)^{\alpha}=\sum_{k=0}^{\infty}\dbinom{\alpha}{k}x^{\alpha-k}y^k
\]
上指标翻转
\[\dbinom{n}{m}=(-1)^{m}\dbinom{m-n-1}{m}
\]
可以将 \(n\) 为负数的情况转化为非负数。
练习
\[\begin{aligned}
\dfrac{1}{1-x}&=(1-x)^{-1}\\
&=\sum_{k=0}^{\infty}\dbinom{-1}{k}(-x)^{k}\\
&=\sum_{k=0}^{\infty}(-1)^{k}\dbinom{k}{k}(-1)^{k}x^k\\
&=\sum_{k=0}^{\infty}x^k
\end{aligned}
\]
\[\begin{aligned}
\dfrac{1}{(1-x)^2}&=(1-x)^{-2}\\
&=\sum_{k=0}^{\infty}\dbinom{-2}{k}(-x)^{k}\\
&=\sum_{k=0}^{\infty}(-1)^k\dbinom{k+1}{k}(-1)^{k}x^k\\
&=\sum_{k=0}^{\infty}\dbinom{k+1}{k}x^k\\
&=\sum_{k=0}^{\infty}(k+1)x^k
\end{aligned}
\]
\[\begin{aligned}
\dfrac{1}{1+x}&=(1+x)^{-1}\\
&=\sum_{k=0}^{\infty}\dbinom{-1}{k}x^k\\
&=\sum_{k=0}^{\infty}(-1)^kx^k
\end{aligned}
\]
\[\begin{aligned}
\dfrac{1}{1-Cx}&=(1-Cx)^{-1}\\
&=\sum_{k=0}^{\infty}\dbinom{-1}{k}(-Cx)^k\\
&=\sum_{k=0}^{\infty}(-1)^k(-1)^k(Cx)^k\\
&=\sum_{k=0}^{\infty}C^kx^k
\end{aligned}
\]
泰勒公式
\[\begin{aligned}
e^x&=\sum_{k=0}^{\infty}\dfrac{1}{k!}x^k\\
xe^x&=\sum_{k=0}^{\infty}\dfrac{k}{k!}x^k\\
e^{Cx}&=\sum_{k=0}^{\infty}\dfrac{C^k}{k!}x^k\\
\ln(1-x)&=-\sum_{k=1}^{\infty}\dfrac{1}{k}x^k
\end{aligned}
\]
普通型生成函数
又名 OGF。
对于任何数列 \(\{A_n\}\),其普通型生成函数定义如下:
\[A(x)=\sum_{i=1}^{n}A_ix^i
\]
OGF 常常和「无标号」计数相关。
问题 1(选物品)
题意
有三种物品,每种物品分别有 \(3,2,3\) 个,问从这三种物品中取出 \(4\) 个的方案数有多少种?
解法
考虑对每个物品构建对应的生成函数
\[\begin{aligned}
G_1(x)&=1+x+x^2+x^3\\
G_2(x)&=1+x+x^2\\
G_3(x)&=1+x+x^2+x^3
\end{aligned}
\]
令 \(F(x)=G_1(x)G_2(x)G_3(x)\),那么 \([x^n]F(x)\)(表示 \(F(x)\) 中 \(x^n\) 这一项的系数) 就是选 \(n\) 个的答案。
正确性证明:
在多项式乘法中,假设 \(G_1(x)\) 选择了 \(x^a\),\(G_2(x)\) 选择了 \(x^b\),\(G_3(x)\) 选择了 \(x^c\),那么乘起来对 \(x^{a+b+c}\) 造成贡献,等价于选了 \(a\) 个第一种物品,\(b\) 个第二种物品,\(c\) 个第三种物品。
\[\begin{aligned}
F(x)&=(1+x+x^2+x^3)^2(1+x+x^2)\\
&=(1+2x+3x^2+4x^3+3x^4+2x^5+x^6)(1+x+x^2)\\
&=1+3x+6x^2+9x^3+10x^4+9x^5+6x^{6}+3x^{7}+x^8
\end{aligned}
\]
那么 \([x^4]F(x)=10\),也就是答案为 \(10\)。
运算小技巧。
这里可以引入卷积的概念,但这是不必要的。
有两个多项式 \(F(x)\) 和 \(G(x)\),假设其系数分别为 \(\{a\}\) 和 \(\{b\}\) 那么最终结果为
\[F(x)G(x)=\sum_{k\ge 0}\left(\sum_{i=0}^{k}a_ib_{k-i}\right)x^k
\]
定义 \(c_k=\sum_{i=0}^{k}a_ib_{k-i}\),可以发现其为 \([x^k]F(x)G(x)\)。
问题 2(P10780 食物)
题意
有如下八种物品:
- 物品一:偶数个。
- 物品二:\(0/1\) 个。
- 物品三:\(0/1/2\) 个。
- 物品四:奇数个。
- 物品五:\(4\) 的倍数个。
- 物品六:\(0/1/2/3\) 个。
- 物品七,\(0/1\) 个。
- 物品八,\(3\) 的倍数个。
问选出 \(n\) 个物品的方案数,答案对 \(10007\) 取模。
解法
和上一题类似,直接定义生成函数。
\[\begin{aligned}
G_1(x)&=\sum_{k=0}^{\infty}x^{2k}\\
&=\dfrac{1}{1-x^2}\\
G_2(x)&=1+x\\
G_3(x)&=1+x+x^2\\
G_4(x)&=\sum_{k=0}^{\infty}x^{2k+1}\\
&=\dfrac{x}{1-x^2}\\
G_5(x)&=\sum_{k=0}^{\infty}x^{4k}\\
&=\dfrac{1}{1-x^4}\\
G_6(x)&=1+x+x^2+x^3\\
G_7(x)&=1+x\\
G_8(x)&=\sum_{k=0}^{\infty}x^{3k}\\
&=\dfrac{1}{1-x^3}
\end{aligned}
\]
然后将所有生成函数相乘。
\[\begin{aligned}
F(x)&=G_1(x)G_2(x)G_3(x)G_4(x)G_5(x)G_6(x)G_7(x)G_8(x)\\
&=\dfrac{(1+x)(1+x+x^2)x(1+x+x^2+x^3)(1+x)}{(1-x^2)(1-x^2)(1-x^4)(1-x^3)}\\
&=\dfrac{x(1+x)^2(1+x+x^2)(1+x+x^2+x^3)}{(1-x^2)^2(1-x^3)(1-x^4)}\\
&=\dfrac{x(1+x+x^2)(1+x+x^2+x^3)}{(1-x)^2(1-x^3)(1-x^4)}\\
&=\dfrac{x(1+x+x^2+x^3)}{(1-x)^3(1-x^4)}\\
&=\dfrac{x}{(1-x)^4}
\end{aligned}
\]
再使用广义二项式定理展开
\[\begin{aligned}
F(x)&=x\cdot (1-x)^{-4}\\
&=x\sum_{k=0}^{\infty}\dbinom{-4}{k}(-x)^k\\
&=x\sum_{k=0}^{\infty}\dbinom{k+3}{k}x^k\\
&=\dfrac{1}{6}\sum_{k=0}^{\infty}(k+3)(k+2)(k+1)x^{k+1}\\
\end{aligned}
\]
那么
\[[x^n]F(x)=\dfrac{1}{6}n(n+1)(n+2)
\]
代码
/**
* Problem: P10780 BZOJ3028 食物
* Author: OIer_wst
* Date: 2025-07-31
*/
#include <bits/stdc++.h>
using lint = long long;
const int MOD = 10007;
lint n;
lint qpow(lint a, lint b) {
lint res = 1;
for (; b; b >>= 1) {
if (b & 1) (res *= a) %= MOD;
(a *= a) %= MOD;
}
return res;
}
int main() {
int ch;
while ((ch = getchar()) != EOF)
if (isdigit(ch)) n = (n * 10 + ch - '0') % MOD;
std::cout << (n * (n + 1) * (n + 2) * qpow(6, MOD - 2)) % MOD << std::endl;
return 0;
}
指数型生成函数
又名 EGF。
对于任何数列 \(\{A_n\}\),其指数型生成函数定义如下:
\[A(x)=\sum_{i=1}^{n}A_i\dfrac{x^i}{i!}
\]
EGF 常常和「有标号」计数相关。
考虑这样一个问题,有序列 \(\{a_n\}\) 和 \(\{b_m\}\),用两个序列中的数构成 \(\{c_{n+m}\}\),那么方案数为 \(\dbinom{n+m}{n}\)。
在转移的时候,可以得到
\[\begin{aligned}
C(n+m)&= A(n)\cdot B(m)\cdot \dbinom{n+m}{n}\\
C(n+m)&= \dfrac{(n+m)!}{n!m!}A(n)B(m)\\
\dfrac{C(n+m)}{(n+m)!}&=\dfrac{A(n)}{n!}\cdot \dfrac{B(m)}{m!}
\end{aligned}
\]
这样就是 EGF 的形式了,而且可以降低转移的复杂度。
问题 3(方格涂色)
题意
用红蓝绿三种颜色去涂 \(1\times n\) 的棋盘,求使得被涂成红色和蓝色的方格数均为偶数的涂色方法数。
解法
假设现在有两种颜色,分别有 \(x\) 个和 \(y\) 个,求填满 \(x+y\) 长度的个数。答案显然为 \(\dbinom{x+y}{x}\)。
那么就和上面的问题一样,直接写出生成函数
\[\begin{aligned}
F(x)&=\left(\sum_{i=0}^{\infty}\dfrac{(2x)^i}{(2i)!}\right)^2\sum_{j=0}^{\infty}\dfrac{x^j}{j!}\\
&=e^x\left(\dfrac{e^x+e^{-x}}{2}\right)^2\\
&=e^x\left(\dfrac{e^{2x}+e^{-2x}+2}{4}\right)\\
&=\dfrac{e^{3x}+e^{-x}+2e^{x}}{4}\\
&=\sum_{k=0}^{\infty}\dfrac{x^k}{4k!}\left(3^k+2+(-1)^k\right)
\end{aligned}
\]
那么答案即 \(\left[\dfrac{x^n}{n!}\right]F(x)=\dfrac{3^n+(-1)^n+2}{4}\)。
问题 4(放球)
题意
求把 \(n\) 个不同的球放到 \(4\) 个不同的盒子 \(A_1,A_2,A_3,A_4\) 里,使得 \(A_1\) 中有奇数个球, \(A_2\) 中有偶数个球的不同放法个数。
解法
\[\begin{aligned}
F(x)&=\left(\sum_{i=0}^{\infty}\dfrac{x^{2i+1}}{(2i+1)!}\right)\left(\sum_{j=0}^{\infty}\dfrac{x^{2j}}{(2j)!}\right)\left(\sum_{k=0}^{\infty}\dfrac{x^k}{k!}\right)^2\\
&=\dfrac{e^x-e^{-x}}{2}\cdot\dfrac{e^x+e^{-x}}{2}\cdot e^{2x}\\
&=\dfrac{e^{2x}-e^{-2x}}{4}\cdot e^{2x}\\
&=\dfrac{e^{4x}-e^{-4x}}{4}\\
&=\sum_{l=0}^{\infty}\dfrac{4^lx^l}{4l!}
\end{aligned}
\]
那么答案即 \(\left[\dfrac{x^n}{n!}\right]F(x)=4^{n-1}\)。
求递推式通项公式
- 定义数列的普通型生成函数;
- 利用递推式展开,得到方程;
- 解方程,得到生成函数的封闭形式;
- 将其用广义二项式定理展开,并且比对系数,得到答案。
斐波那契数列
已知 \(f_0=f_1=1\),\(f_n=f_{n-1}+f_{n-2}(n\ge 2)\),求 \(f\) 的通项公式。
\[\begin{aligned}
F(x)&=\sum_{i=0}^{\infty}f_ix^i\\
&=\sum_{i=2}^{\infty}f_{i-1}x^i+\sum_{j=2}^{\infty}f_{j-2}x^j+x+1\\
&=x\sum_{i=2}^{\infty}f_{i-1}x^{i-1}+x^2\sum_{j=2}^{\infty}f_{j-2}x^{j-2}+x+1\\
&=x(F(x)-1)+x^2F(x)+x+1\\
&=x^2F(x)+xF(x)+1
\end{aligned}
\]
整理一下,可以得到
\[\begin{aligned}
F(x)&=x^2F(x)+xF(x)+1\\
(1-x-x^2)F(x)&=1\\
F(x)&=\dfrac{1}{1-x-x^2}
\end{aligned}
\]
令
\[1-x-x^2=(1-\alpha x)(1-\beta x)
\]
可以解得
\[\begin{cases}
\alpha = \dfrac{1+\sqrt5}{2}\\
\beta = \dfrac{1-\sqrt5}{2}\\
\end{cases}
\]
再令
\[\dfrac{1}{(1-\alpha x)(1-\beta x)}=\dfrac{A}{1-\alpha x}+\dfrac{B}{1-\beta x}
\]
比较系数可得
\[\begin{cases}
A+B=1\\
A\beta+B\alpha=0
\end{cases}
\]
解得
\[\begin{cases}
A=\dfrac{\alpha}{\alpha-\beta}=\dfrac{\alpha}{\sqrt5}\\
B=1-\dfrac{\alpha}{\sqrt5}=\dfrac{-\beta}{\sqrt5}\\
\end{cases}
\]
用广义二项式定理展开
\[\begin{aligned}
\dfrac{1}{1-\alpha x}&=\sum_{i=0}^{\infty}\alpha^ix^i\\
\dfrac{1}{1-\beta x}&=\sum_{j=0}^{\infty}\beta^jx^j
\end{aligned}
\]
回代入 \(F(x)\) 可得
\[\begin{aligned}
F(x)&=\dfrac{\alpha}{\sqrt5}\sum_{i=0}^{\infty}\alpha^ix^i-\dfrac{\beta}{\sqrt5}\sum_{j=0}^{\infty}\beta^jx^j\\
&=\sum_{k=0}^{\infty}\dfrac{\alpha^{i+1}-\beta^{i+1}}{\sqrt5}x^k
\end{aligned}
\]
那么
\[\begin{aligned}
f_n&=[x^n]F(x)\\
&=\dfrac{\left(\dfrac{1+\sqrt5}{2}\right)^{n+1}-\left(\dfrac{1-\sqrt5}{2}\right)^{n+1}}{\sqrt5}
\end{aligned}
\]
这样我们就得到了斐波那契数列的通项公式。
卡特兰数列