符号化方法(symbolic method)是将组合对象快速转换成生成函数的一种方法,我们将考虑对于集合上定义的特定运算,然后导出其对应的生成函数的运算。
我们称一个组合类(或简称为类)为 (A,∣⋅∣),其中 A 为组合对象的集合,函数 ∣⋅∣ 将每一个组合对象映射为一个非负整数,一般称为大小函数。需要注意的是这个非负整数不能是无限大的。例如对于字符集为 {0,1} 的字符串,可以将字符串的长度设置为其大小函数;对于树或图可将节点的数量设置为其大小函数,注意这并非绝对,也可能将某些特定节点的大小函数设置为 0 等。
本文是基于 Analytic Combinatorics 一书第一章的简化。
无标号体系
在无标号体系中将使用普通生成函数(OGF)。对于集合 A 其对应 OGF 记为
A(z)=α∈A∑z∣α∣=n≥0∑anzn
我们约定使用同一组的字母表示同一个类对应的生成函数等,例如用 an 表示 [zn]A(z) 即 A(z) 中 zn 的系数,用 An 表示 A 中大小函数为 n 的对象的集合(所以 an=card(An) 其中 card 为基数(cardinality))。
本文将不讨论可容许性(admissibility),读者可参考文献中的内容。
下面将引入两种特殊的组合类和组合对象:
- 记 ϵ 为中性对象(neutral object)和 E={ϵ} 为中性类(neutral class),中性对象的大小为 0,中性类的 OGF 为 E(z)=1。
- 记 ∘ 或 ∙ 为原子对象(atom object)和 Z∘={∘} 或 Z∙={∙} 或简写为 Z 为原子类(atom class),原子对象的大小为 1,原子类的 OGF 为 Z(z)=z。
对于两个组合类 A 和 B 在组合意义上同构记为 A=B 或 A≅B,但仅当该同构不平凡时才使用后者的记号。
我们有
A≅E×A≅A×E
其中 × 为二元运算,表示集合的笛卡尔积。
集合的(不相交)并构造
对于类 A 和 B 的并记为
A+B=(E1×A)+(E2×B)
如此定义可以不违背集合论中集合不相交的要求,我们可以想象成将 A 中的对象染色成红色,将 B 中的对象染色成蓝色。
对应 OGF 为
A(z)+B(z)
考虑
A(z)+B(z)=α∈A∑z∣α∣+β∈B∑z∣β∣=n≥0∑(an+bn)zn
对应形式幂级数的加法。
集合的笛卡尔积构造
对于类 A 和 B 的笛卡尔积记为
A×B={(α,β)∣α∈A,β∈B}
对应 OGF 为
A(z)⋅B(z)
我们定义 (α,β) 的大小为其组成部分的大小之和,那么显然也有
γ=(α1,α2,…,αn)⟹∣γ∣=∣α1∣+∣α2∣+⋯+∣αn∣
所以
A(z)⋅B(z)=(α∈A∑z∣α∣)β∈B∑z∣β∣=(α,β)∈(A×B)∑z∣α∣+∣β∣=n≥0∑i+j=n∑aibjzn
对应形式幂级数的乘法。
集合的 Sequence 构造
Sequence 构造生成了所有可能的组合。
SEQ({a})SEQ({a,b})={ϵ}+{a}+{(a,a)}+{(a,a,a)}+⋯={ϵ}+{a,b}+{(a,b)}+{(b,a)}+{(a,a)}+{(b,b)}+{(a,b,a)}+{(a,b,b)}+{(a,a,b)}+{(b,b,a)}+{(b,a,b)}+{(b,b,b)}+{(a,a,a)}+{(b,a,a)}+⋯
可以看到 {(a,b)},{(b,a)} 这样组成部分的顺序不同的元素被生成了,可以认为 Sequence 构造生成了有序的组合。
我们定义
SEQ(A)=E+A+(A×A)+(A×A×A)+⋯
且要求 A0=∅,也就是 A 中没有大小为 0 的对象。
对应 OGF 为
Q(A(z))=1+A(z)+A(z)2+A(z)3+⋯=1−A(z)1
其中 Q 为 Pólya 准逆(quasi-inversion)。
例:有序有根树(ordered rooted tree)
我们可以使用 Sequence 构造来定义有序有根树,即孩子之间的顺序有意义的有根树,设该组合类为 T 那么一棵树为一个根节点和树的 Sequence,即
T={∙}×SEQ(T)
对应 OGF 为
T(z)=1−T(z)z
前几项系数为 0 1 1 2 5 14 42 132 429 1430 4862 16796,忽略常数项即 OEIS A000108。
集合的 Multiset 构造
Multiset 构造生成了所有可能的组合,但不区分组成部分的元素之间的顺序。
MSET({a})MSET({a,b})={ϵ}+{a}+{(a,a)}+{(a,a,a)}+⋯={ϵ}+{a}+{(a,a)}+{(a,a,a)}+⋯+{b}+{(a,b)}+{(a,a,b)}+⋯+{(b,b)}+{(a,b,b)}+{(a,a,b,b)}+⋯+⋯
注意到 {(b,a)},{(a,b,a)} 在 SEQ({a,b}) 中出现,但在 MSET({a,b}) 没有出现,可以认为 Multiset 生成了无序的组合。
我们定义其递推式为
MSET({α0,α1,…,αn})=MSET({α0,α1,…,αn−1})×SEQ({αn})
即
MSET(A)=α∈A∏SEQ({α})
且要求 A0=∅。或者也可以给出等价的
MSET(A)=SEQ(A)/R
其中 R 为等价关系,我们说 (α1,…,αn)R(β1,…,βn) 当且仅当存在任一置换 σ 对于所有 j 满足 βj=ασ(j)。
对应 OGF 为
Exp(A(z))=α∈A∏(1−z∣α∣)−1=n≥1∏(1−zn)−an
注意到
ln(1+z)=1z−2z2+3z3−⋯=n≥1∑n(−1)n−1zn
且 A(z)=exp(ln(A(z))) 所以
Exp(A(z))=exp(n≥1∑−an⋅ln(1−zn))=exp(n≥1∑−an⋅m≥1∑m−znm)=exp(1A(z)+2A(z2)+3A(z3)+⋯)
其中 Exp 为 Pólya 指数,也被称为 Euler 变换。
题意:令 f(n) 表示将 n 进行分拆的方案数,求 f(1),f(2),…,f(105) 对 998244353 取模的值。
解:设全体正整数类为 I,那么 I=SEQ≥1(Z)=Z×SEQ(Z)(下标 ≥1 为有限制的构造,见后文)。所求即
MSET(I)
对应 OGF 前几项系数为 1 2 3 5 7 11 15 22 30 42(忽略常数项)即 OEIS A000041。
题意:给出 n 种体积分别为 v1,…,vn 的商品和正整数 m,求体积为 1,2,…,m 的背包装满的方案数(商品数量不限,有同体积的不同种商品)对 998244353 取模的值。约定 1≤n,m≤105 且 1≤vi≤m。
解:设商品的组合类为 A,所求即 MSET(A) 对应 OGF 的系数。
题意:求出 n 个节点的无标号无根树的个数对 998244353 取模的值。约定 1≤n≤2×105。
解:设无标号有根树的组合类为 T,那么
T={∙}×MSET(T)
根据 Richard Otter 的论文 The Number of Trees 中的描述,对应无根树的 OGF 为
T(z)−21T2(z)+21T(z2)
前几项系数为 1 1 1 2 3 6 11 23 47 106(忽略常数项)即 OEIS A000055。
集合的 Powerset 构造
Powerset 构造生成了所有子集。
PSET({a})PSET({a,b})PSET({a,b,c})={ϵ}+{a}={ϵ}+{a}+{b}+{(a,b)}={ϵ}+{a}+{b}+{(a,b)}+{c}+{(a,c)}+{(b,c)}+{(a,b,c)}
我们定义其递推式为
PSET({α0,α1,…,αn})=PSET({α0,α1,…,αn−1})×({ϵ}+{αn})
即
PSET(A)≅α∈A∏({ϵ}+{α})
且要求 A0=∅。
对应 OGF 为
Exp(A(z))=α∈A∏(1+z∣α∣)=n≥1∏(1+zn)an=exp(n≥1∑an⋅ln(1+zn))=exp(n≥1∑an⋅m≥1∑m(−1)m−1znm)=exp(1A(z)−2A(z2)+3A(z3)−⋯)
其中 Exp 为 Pólya 指数·改。
容易发现 PSET(A)⊂MSET(A)。
集合的 Cycle 构造
Cycle 构造生成了所有可能的组合,但不区分仅轮换不同的组合。
我们定义为
CYC(A)=(SEQ(A)∖{ϵ})/S
其中 S 为等价关系,我们说 (α1,…,αn)S(β1,…,βn) 当且仅当存在任一循环移位 τ 对于所有 j 都满足 βj=ατ(j)。
为了简便我们令 a,b 均为大小为 1 的字符,这里仅列举大小为 3 和 4 的字符串:
CYC({a,b})3={aaa}+{aab}+{abb}+{bbb}
其中 aabSbaaSaba 只保留其一,同样的 abbSbabSbba 只保留其一。
CYC({a,b})4={aaaa}+{aaab}+{aabb}+{abbb}+{bbbb}+{abab}
其中 aaabSbaaaSabaaSaaba,aabbSbaabSbbaaSabba,abbbSbabbSbbabSbbba 和 ababSbaba。
对应 OGF 为
Log(A(z))=n≥1∑nφ(n)ln1−A(zn)1
其中 φ 为 Euler 函数,Log 为 Pólya 对数。
由于证明较复杂,读者可参考 Flajolet 的论文 The Cycle Construction 或 Analytic Combinatorics 的附录。
有限制的构造
对于上述所有构造,我们都没有限制其「组成部分」的个数,若在 SEQ 的下标给一个作用于整数的谓词用于约束其组成部分,如
SEQ=k(B),SEQ≥k(B),SEQ1..k(B)
其中 SEQ=k(B) 也常简写为 SEQk(B),SEQ1..k(B) 表示在区间 [1..k] 上。
令 K 为任意上述 SEQ,PSET,MSET,CYC 之一,以及
A=Kk(B)
即我们需要对于 α∈A 有
α={(β1,β2,…,βk)∣β∈B}
设 χ 函数作用于组合对象上为其组成部分的个数,也就是要令 χ(α)=k,不妨增加一元来「跟踪」组成部分的个数。
令
An,k=card{α∈A∣∣α∣=n,χ(α)=k}
那么
A(z,u)=n,k∑An,kukzn=α∈A∑z∣α∣uχ(α)
然后我们只要提取出 uk 的系数即可获得对应表达式,例如 A=SEQk(B) 可直接导出
⟹A(z,u)=k≥0∑ukB(z)k=1−uB(z)1A(z)=B(z)k
显然也有
A=SEQ≥k(B)⟹A(z)=1−B(z)B(z)k
而对于 MSETk(B) 和 PSETk(B) 已经有
⟹A(z,u)=n∏(1−uzn)−bnA(z)=[uk]exp(1uB(z)+2u2B(z2)+3u3B(z3)+⋯)
和
⟹A(z,u)=n∏(1+uzn)bnA(z)=[uk]exp(1uB(z)−2u2B(z2)+3u3B(z3)−⋯)
对于 CYCk(B) 同理。
使用上式计算 MSET3(B) 和 MSET4(B) 对应 OGF
尝试计算 A=MSET3(B) 为
[u3]A(z,u)=0!1([u3]1)+1!1([u3](1uB(z)+2u2B(z2)+3u3B(z3)+⋯))+2!1([u3](1uB(z)+2u2B(z2)+⋯)2)+3!1([u3](1uB(z)+⋯)3)=6B(z)3+2B(z)B(z2)+3B(z)3
尝试计算 A=MSET4(B) 为
[u4]A(z,u)=0!1([u4]1)+1!1([u4](1uB(z)+2u2B(z2)+3u3B(z3)+4u4B(z4)+⋯))+2!1([u4](1uB(z)+2u2B(z2)+3u3B(z3)+⋯)2)+3!1([u4](1uB(z)+2u2B(z2)+⋯)3)+4!1([u4](1uB(z)+⋯)4)=4B(z4)+2!1(4B(z2)2+32B(z)B(z3))+3!1(23B(z)2B(z2))+4!B(z)4=24B(z)4+4B(z)2B(z2)+3B(z)B(z3)+8B(z2)2+4B(z4)
我们发现 A=Kk(B) 中 A(z) 是关于 B(z),B(z2),…,B(zk) 的一个表达式。
需要注意的是对于有限制的构造 Kk(B) 并没有要求 B0=∅。
PSET2(A)MSET2(A)CYC2(A):2A(z)2−2A(z2):2A(z)2+2A(z2):2A(z)2+2A(z2)
PSET3(A)MSET3(A)CYC3(A):6A(z)3−2A(z)A(z2)+3A(z3):6A(z)3+2A(z)A(z2)+3A(z3):3A(z)3+32A(z3)
PSET4(A)MSET4(A)CYC4(A):24A(z)4−4A(z)2A(z2)+3A(z)A(z3)+8A(z2)2−4A(z4):24A(z)4+4A(z)2A(z2)+3A(z)A(z3)+8A(z2)2+4A(z4):4A(z)4+4A(z2)2+2A(z4)
上面的计算方法虽然有效但比较麻烦,读者可阅读 WolframMathWorld 网站的 Pólya Enumeration Theorem 和 Cycle Index 等相关资料,后者 Cycle Index 在 OEIS 的生成函数表达式中也经常出现。
题意:求出 n 个节点的有根且根节点度数不超过 3,其余节点度数不超过 4 的无序树的个数对 998244353 取模的值。约定 1≤n≤105。
解:设组合类为 T 那么
T={∙}×MSET0,1,2,3(T)
或令组合类 T^=T+{ϵ} 那么
T^={ϵ}+{∙}×MSET3(T^)
可得到相同的结果。
参考文献