生成函数进阶

这篇博客深入探讨了生成函数在组合问题中的应用,包括一般生成函数(OGF)和指数生成函数(EGF)的定义、运算及其在序列和集合计数中的使用。此外,还详细介绍了置换计数、背包计数问题的解决方案,以及有标号和无标号树的计数方法,提供了多项式乘法和取对等计算技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以先看这篇博客的生成函数和多项式部分。

在开头我们再次回顾生成函数定义:

一般生成函数(OGF)

一般用于处理组合问题(无标号)

F ( x ) = ∑ i = 0 ∞ f i x i F(x)=\sum_{i=0}^{\infin}f_ix^i F(x)=i=0fixi

OGF的运算

假设现在有两类组合对象 A , B A,B A,B

首先考虑如何对它们取并

显然对于一个元素 t t t,在 A A A中出现了 a t a_t at次,在 B B B中出现了 b t b_t bt次,一共会出现 a t + b t a_t+b_t at+bt

记为 C ( x ) = A ( x ) + B ( x ) C(x)=A(x)+B(x) C(x)=A(x)+B(x)

那么对应标号的系数相加即可

然后考虑如何求它们的笛卡尔积

假设 A , B A,B A,B笛卡尔积为 C C C,那么表示 C C C中每个元素 c c c都是由 A A A中的一个元素 a a a B B B中的一个元素 b b b拼成的二元组 ( a , b ) , ∣ c ∣ = ∣ a ∣ + ∣ b ∣ (a,b),|c|=|a|+|b| (a,b),c=a+b

记为 C ( x ) = A ( x ) B ( x ) C(x)=A(x)B(x) C(x)=A(x)B(x)

在生成函数为有限项的时候用 F F T / N T T FFT/NTT FFT/NTT多项式乘法即可

OGF生成序列

现在有一类组合对象 A A A,定义 s e q ( A ) seq(A) seq(A) 是由 A A A的元素排列成的序列组成的集
合,一个序列的大小定义为其元素大小总和。
e g 1 : A = { " 0 " , " 1 " } eg1:A=\{"0","1"\} eg1:A={ "0","1"} s e q ( A ) = { a l l   01   s t r i n g } seq(A)=\{all\ 01\ string\} seq(A)={ all 01 string}
e g 2 : N ∗ = { 1 , 2 , 3 , . . . } eg2:N^*=\{1,2,3,...\} eg2:N={ 1,2,3,...},元素的大小定义为它的数值,则 s e q ( N ) = { 正 整 数 的 有 序 拆 分 } seq(N)=\{正整数的有序拆分\} seq(N)={ }
规定A 中不含大小为0 的元素,则
s e q ( A ) = 1 + A + A 2 + A 3 + . . . = 1 1 − A seq(A)=1+A+A^2+A^3+...=\frac1{1-A} seq(A)=1+A+A2+A3+...=1A1


指数生成函数(EGF)

一般用于处理组合问题(有标号)
常见带标号的组合对象:标号图,置换
将两个元素 a , b a,b a,b拼接起来, ∣ a ∣ = n , ∣ b ∣ = m |a|=n,|b|=m a=n,b=m
无标号时,只有一种方法;
带标号时,规定拼接时拼接对象内部相对标号顺序不变,而互相的标号
可以改变,则有 ( n + m ) ! n ! m ! = C n + m n \frac{(n+m)!}{n!m!}=C_{n+m}^n n!m!(n+m)!=Cn+mn种方法

F ( x ) = ∑ i = 0 ∞ f i x i i ! F(x)=\sum_{i=0}^{\infin}f_i\frac{x^i}{i!} F(x)=i=0fii!xi

EGF的运算

并集: C ( x ) = A ( x ) + B ( x ) C(x)=A(x)+B(x) C(x)=A(x)+B(x)
笛卡尔积: C ( x ) = A ( x ) B ( x ) C(x)=A(x)B(x) C(x)=A(x)B(x)
对比系数后很好理解

EGF生成序列

O G F OGF OGF s e q ( A ) = 1 1 − A seq(A)=\frac1{1-A} seq(A)=1A1

EGF生成集合

集合与序列的区别:同样由 i i i E G F EGF EGF生成,集合的顺序不重要,序列的顺序确实确定的。
因此由 i i i E G F EGF EGF生成的集合应该有一个 1 i ! \frac1{i!} i!1的系数。
s e t ( A ) = ∑ i = 0 ∞ A i i ! = e A set(A)=\sum_{i=0}^{\infin}\frac{A^i}{i!}=e^{A} set(A)=i=0i!Ai=eA


生成函数计数

置换计数

一个置换是由若干轮换组成的集合。
k k k轮换的个数有 ( k − 1 ) ! (k-1)! (k1)!个,对应 E G F EGF EGF ( k − 1 ) ! x k k ! = x k k (k-1)!\frac{x^k}{k!}=\frac{x^k}k (k1)!k!xk=kxk
于是全体轮换的 E G F = ∑ i = 0 ∞ x k k EGF=\sum_{i=0}^{\infin}\frac{x^k}k EGF=i=0kxk
f ( x ) = ∑ i = 0 ∞ x k k f(x)=\sum_{i=0}^{\infin}\frac{x^k}k f(x)=i=0kxk
那么 f ′ ( x ) = ∑ i = 0 ∞ x k = 1 1 − x f'(x)=\sum_{i=0}^{\infin}x^k=\frac1{1-x} f(x)=i=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值