跳转至

符号化方法

符号化方法(symbolic method)是将组合对象快速转换成生成函数的一种方法,我们将考虑对于集合上定义的特定运算,然后导出其对应的生成函数的运算。

我们称一个组合类(或简称为类)为 (A,||),其中 A 为组合对象的集合,函数 || 将每一个组合对象映射为一个非负整数,一般称为大小函数。需要注意的是这个非负整数不能是无限大的。例如对于字符集为 {0,1} 的字符串,可以将字符串的长度设置为其大小函数;对于树或图可将节点的数量设置为其大小函数,注意这并非绝对,也可能将某些特定节点的大小函数设置为 0 等。

本文是基于 Analytic Combinatorics 一书第一章的简化。

无标号体系

在无标号体系中将使用普通生成函数(OGF)。对于集合 A 其对应 OGF 记为

A(z)=αAz|α|=n0anzn

我们约定使用同一组的字母表示同一个类对应的生成函数等,例如用 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

对于两个组合类 AB 在组合意义上同构记为 A=BAB,但仅当该同构不平凡时才使用后者的记号。

我们有

AE×AA×E

其中 × 为二元运算,表示集合的笛卡尔积。

集合的(不相交)并构造

对于类 AB 的并记为

A+B=(E1×A)+(E2×B)

如此定义可以不违背集合论中集合不相交的要求,我们可以想象成将 A 中的对象染色成红色,将 B 中的对象染色成蓝色。

对应 OGF 为

A(z)+B(z)

考虑

A(z)+B(z)=αAz|α|+βBz|β|=n0(an+bn)zn

对应形式幂级数的加法。

集合的笛卡尔积构造

对于类 AB 的笛卡尔积记为

A×B={(α,β)αA,βB}

对应 OGF 为

A(z)B(z)

我们定义 (α,β) 的大小为其组成部分的大小之和,那么显然也有

γ=(α1,α2,,αn)|γ|=|α1|+|α2|++|αn|

所以

A(z)B(z)=(αAz|α|)(βBz|β|)=(α,β)(A×B)z|α|+|β|=n0i+j=naibjzn

对应形式幂级数的乘法。

集合的 Sequence 构造

Sequence 构造生成了所有可能的组合。

SEQ({a})={ϵ}+{a}+{(a,a)}+{(a,a,a)}+SEQ({a,b})={ϵ}+{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+=11A(z)

其中 Q 为 Pólya 准逆(quasi-inversion)。

例:有序有根树(ordered rooted tree)

我们可以使用 Sequence 构造来定义有序有根树,即孩子之间的顺序有意义的有根树,设该组合类为 T 那么一棵树为一个根节点和树的 Sequence,即

T={}×SEQ(T)

对应 OGF 为

T(z)=z1T(z)

前几项系数为 0 1 1 2 5 14 42 132 429 1430 4862 16796,忽略常数项即 OEIS A000108

集合的 Multiset 构造

Multiset 构造生成了所有可能的组合,但不区分组成部分的元素之间的顺序。

MSET({a})={ϵ}+{a}+{(a,a)}+{(a,a,a)}+MSET({a,b})={ϵ}+{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,,αn1})×SEQ({αn})

MSET(A)=αASEQ({α})

且要求 A0=。或者也可以给出等价的

MSET(A)=SEQ(A)/R

其中 R 为等价关系,我们说 (α1,,αn)R(β1,,βn) 当且仅当存在任一置换 σ 对于所有 j 满足 βj=ασ(j)

对应 OGF 为

Exp(A(z))=αA(1z|α|)1=n1(1zn)an

注意到

ln(1+z)=z1z22+z33=n1(1)n1znn

A(z)=exp(ln(A(z))) 所以

Exp(A(z))=exp(n1anln(1zn))=exp(n1anm1znmm)=exp(A(z)1+A(z2)2+A(z3)3+)

其中 Exp 为 Pólya 指数,也被称为 Euler 变换。

例题 LOJ 6268. 分拆数

题意:令 f(n) 表示将 n 进行分拆的方案数,求 f(1),f(2),,f(105)998244353 取模的值。

:设全体正整数类为 I,那么 I=SEQ1(Z)=Z×SEQ(Z)(下标 1 为有限制的构造,见后文)。所求即

MSET(I)

对应 OGF 前几项系数为 1 2 3 5 7 11 15 22 30 42(忽略常数项)即 OEIS A000041

例题 洛谷 P4389 付公主的背包

题意:给出 n 种体积分别为 v1,,vn 的商品和正整数 m,求体积为 1,2,,m 的背包装满的方案数(商品数量不限,有同体积的不同种商品)对 998244353 取模的值。约定 1n,m1051vim

:设商品的组合类为 A,所求即 MSET(A) 对应 OGF 的系数。

例题 洛谷 P5900 无标号无根树计数

题意:求出 n 个节点的无标号无根树的个数对 998244353 取模的值。约定 1n2×105

:设无标号有根树的组合类为 T,那么

T={}×MSET(T)

根据 Richard Otter 的论文 The Number of Trees 中的描述,对应无根树的 OGF 为

T(z)12T2(z)+12T(z2)

前几项系数为 1 1 1 2 3 6 11 23 47 106(忽略常数项)即 OEIS A000055

集合的 Powerset 构造

Powerset 构造生成了所有子集。

PSET({a})={ϵ}+{a}PSET({a,b})={ϵ}+{a}+{b}+{(a,b)}PSET({a,b,c})={ϵ}+{a}+{b}+{(a,b)}+{c}+{(a,c)}+{(b,c)}+{(a,b,c)}

我们定义其递推式为

PSET({α0,α1,,αn})=PSET({α0,α1,,αn1})×({ϵ}+{αn})

PSET(A)αA({ϵ}+{α})

且要求 A0=

对应 OGF 为

Exp(A(z))=αA(1+z|α|)=n1(1+zn)an=exp(n1anln(1+zn))=exp(n1anm1(1)m1znmm)=exp(A(z)1A(z2)2+A(z3)3)

其中 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 的字符,这里仅列举大小为 34 的字符串:

CYC({a,b})3={aaa}+{aab}+{abb}+{bbb}

其中 aabSbaaSaba 只保留其一,同样的 abbSbabSbba 只保留其一。

CYC({a,b})4={aaaa}+{aaab}+{aabb}+{abbb}+{bbbb}+{abab}

其中 aaabSbaaaSabaaSaabaaabbSbaabSbbaaSabbaabbbSbabbSbbabSbbbaababSbaba

对应 OGF 为

Log(A(z))=n1φ(n)nln11A(zn)

其中 φ 为 Euler 函数,Log 为 Pólya 对数。

由于证明较复杂,读者可参考 Flajolet 的论文 The Cycle Construction 或 Analytic Combinatorics 的附录。

有限制的构造

对于上述所有构造,我们都没有限制其「组成部分」的个数,若在 SEQ 的下标给一个作用于整数的谓词用于约束其组成部分,如

SEQ=k(B),SEQk(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,kAn,kukzn=αAz|α|uχ(α)

然后我们只要提取出 uk 的系数即可获得对应表达式,例如 A=SEQk(B) 可直接导出

A(z,u)=k0ukB(z)k=11uB(z)A(z)=B(z)k

显然也有

A=SEQk(B)A(z)=B(z)k1B(z)

而对于 MSETk(B)PSETk(B) 已经有

A(z,u)=n(1uzn)bnA(z)=[uk]exp(u1B(z)+u22B(z2)+u33B(z3)+)

A(z,u)=n(1+uzn)bnA(z)=[uk]exp(u1B(z)u22B(z2)+u33B(z3))

对于 CYCk(B) 同理。

使用上式计算 MSET3(B)MSET4(B) 对应 OGF

尝试计算 A=MSET3(B)

[u3]A(z,u)=10!([u3]1)+11!([u3](u1B(z)+u22B(z2)+u33B(z3)+))+12!([u3](u1B(z)+u22B(z2)+)2)+13!([u3](u1B(z)+)3)=B(z)36+B(z)B(z2)2+B(z)33

尝试计算 A=MSET4(B)

[u4]A(z,u)=10!([u4]1)+11!([u4](u1B(z)+u22B(z2)+u33B(z3)+u44B(z4)+))+12!([u4](u1B(z)+u22B(z2)+u33B(z3)+)2)+13!([u4](u1B(z)+u22B(z2)+)3)+14!([u4](u1B(z)+)4)=B(z4)4+12!(B(z2)24+2B(z)B(z3)3)+13!(3B(z)2B(z2)2)+B(z)44!=B(z)424+B(z)2B(z2)4+B(z)B(z3)3+B(z2)28+B(z4)4

我们发现 A=Kk(B)A(z) 是关于 B(z),B(z2),,B(zk) 的一个表达式。

需要注意的是对于有限制的构造 Kk(B) 并没有要求 B0=

常用有限制的构造 PSET2(A):A(z)22A(z2)2MSET2(A):A(z)22+A(z2)2CYC2(A):A(z)22+A(z2)2 PSET3(A):A(z)36A(z)A(z2)2+A(z3)3MSET3(A):A(z)36+A(z)A(z2)2+A(z3)3CYC3(A):A(z)33+2A(z3)3 PSET4(A):A(z)424A(z)2A(z2)4+A(z)A(z3)3+A(z2)28A(z4)4MSET4(A):A(z)424+A(z)2A(z2)4+A(z)A(z3)3+A(z2)28+A(z4)4CYC4(A):A(z)44+A(z2)24+A(z4)2

上面的计算方法虽然有效但比较麻烦,读者可阅读 WolframMathWorld 网站的 Pólya Enumeration TheoremCycle Index 等相关资料,后者 Cycle Index 在 OEIS 的生成函数表达式中也经常出现。

例题 LOJ 6538. 烷基计数 加强版 加强版

题意:求出 n 个节点的有根且根节点度数不超过 3,其余节点度数不超过 4 的无序树的个数对 998244353 取模的值。约定 1n105

:设组合类为 T 那么

T={}×MSET0,1,2,3(T)

或令组合类 T^=T+{ϵ} 那么

T^={ϵ}+{}×MSET3(T^)

可得到相同的结果。

参考文献