【学习笔记】生成函数
1.【意义】
生成函数的意义,是对组合问题进行范式转换,把离散的组合结构翻译成连续的、可分析的代数对象,用整个分析学的武器库去处理组合问题。
其副产品是解递推求通项
2.【运算】
生成函数的运算在定义上是形式幂级数的代数运算,可以用封闭形式做四则运算然后转成形式幂级数
形式幂级数乘除法实际上等价于背包和退背包AT_fps_24_g 硬貨
3.【分类】
3.1 普通生成函数(普通型)
生成函数是组合计数的 “万能工具”,核心思想是:用多项式的系数表示方案数,用多项式乘法表示 “组合” 的计数。
① 数的拆分(整数分拆)
问题:把一个整数 \(n\) 拆成若干个正整数之和,不计顺序的方案数。
生成函数构造示例:
拆分中 “1 的个数” 对应:
\[1+x+x^2+x^3+\cdots=\frac{1}{1-x}
\]
拆分中 “2 的个数” 对应:
\[1+x^2+x^4+x^6+\cdots=\frac{1}{1-x^2}
\]
以此类推,整体生成函数为:
\[G(x)=(1+x+x^2+\dots)(1+x^2+x^4+\dots)(1+x^3+x^6+\dots)\cdots
\]
笔记中的示例:
数列 \(1,1,1,2,3,5,7,7,\dots\) 可以用多个多项式的乘积表示:
\[(1+x+x^2+x^3)(1+x^2)(1+x^3)\cdots(1+x^7+x^{14})
\]
完全背包计数:整数分拆本质上等价于 “完全背包” 问题(物品为 \(1,2,3,\dots\),重量为其本身,求凑出总重量 \(n\) 的方案数),时间复杂度为 \(O(n^2)\)。
// 完全背包求拆分方案数
for (int i = 1; i <= n; i++) //i 表示当前物品(拆分的数)
for (int j = i; j <= n; j++) //j 表示当前凑出的和
dp[j] += dp[j - i]; // 状态转移
3.2 指数生成函数(排列计数)
指数生成函数用于解决带标号的排列问题,核心公式为:
\[G_e(x)=\sum_{n=0}^{\infty} a_n \cdot \frac{x^n}{n!}
\]
其中 \(a_n\) 是方案数,乘以 \(\displaystyle\frac{1}{n!}\) 后,多项式相乘可以自动处理排列的计数。
常用收敛级数
普通等比级数:
\[1+x+x^2+x^3+\cdots=\frac{1}{1-x}
\]
指数级数:
\[1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots=e^x
\]
指数生成函数的核心就是用 \(e^x\) 及其变形来表示不同排列问题。

浙公网安备 33010602011771号