【学习笔记】生成函数

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\) 及其变形来表示不同排列问题。

posted @ 2026-08-21 16:47  Aistyr  阅读(7)  评论(0)    收藏  举报