组合符号化(上)
本文共约 14500 字。
Key Words:DP 中的卷积,分拆数,贝尔数,解析组合,OGF,无标号组合构造,EGF,二项卷积,有标号组合构造
DP 中的卷积
组合计数 DP 中经常出现加法卷积的形式,此时可以利用形式幂级数解决问题。接下来,我们将观察一系列经典例子,为学习解析组合做铺垫。
卡塔兰数
- 卡塔兰数
满足 , 时 为 对括号构成的合法括号序列数。
接下来求
先将组合问题转化为代数形式。对含有
考察常数项,
可提取系数
我们运用的分析方法可以概括为“组合递推式
背包的合并
记
若同时考虑两组物品,
组合意义:枚举在第一堆物品
可以发现这就是加法卷积。构造生成函数
例:有
求和只有
分拆数
- 记
为将 拆分成若干无序正整数的和的方案数,称为分拆数。
例:
拆分数可以转化为完全背包问题:每个正整数都可以用任意多次,可以视作重量为
重量为
如何计算
发现展开式中大部分项的系数都为
- 五边形数定理
它在
后文将指出,
对应解析组合中的 ,并给出一个 的计算方法。
染色问题(带标号背包,二项卷积)
- 用
种颜色染一条有 个格子的纸带,每种颜色的使用次数有一些要求(如:颜色 必须染奇数次,颜色 不能染超过 次等),求染色方案数。
考虑 DP,记
若将两组颜色都用上,
该公式和加法卷积非常相似,但携带有二项式系数
数列
构造生成函数
为了方便表述,约定
接下来用 EGF 表示本题的 DP。第
- 例一:颜色没有使用限制
这相当于每个位置随意染
再看生成函数的推理,每种颜色的 EGF 均为
也得到正确答案。
- 例二:用红蓝绿三种颜色,染一条有
个格子的纸带,使得红色和蓝色的格数是偶数(包括 ),求方案数。
绿色的 EGF 显然是
红蓝的 EGF 只有偶数项,即
答案的 EGF 是
提取
连通图计数
个节点的有标号无向图有 条可能的边,每条边都可能存在或不存在,故有标号无向图共有 种。这其中,有一些图是连通的,求 个点的有标号无向连通图的个数。
考虑 DP。记
设节点编号为
在点
中选出 个点,和点 组成连通块,记为点集 。 连接点
内部的边,方案数为 (要求连通)。 连接其余点内部的边,方案数为
(随意连接)。
故方案数为
拆开组合数整理得
贝尔数
- 记
为将数字 划分为若干个无序集合的方案数,称为贝尔数。
贝尔数满足如下递推式
组合意义:枚举
将组合数拆开,可得加法卷积的形式
对于右侧,构造
左侧怎么处置呢?构造
观察
解这个微分方程,得
可以用多项式 exp 计算
解析组合
解析组合试图以一个较为机械化的方式帮助我们将组合计数问题从模型直接转为生成函数。——EntropyIncreaser
符号化组合对象,解救选手于组合意义的地狱之中。——x义x
在上一小节中,我们分析了一系列组合问题,主要是将组合 DP 中的卷积转化为生成函数。
在分析过程中,一些关键的组合结构反复出现,能否用一种系统的方法,从组合结构直接得到生成函数,从而省去复杂的组合/代数推导?解析组合正是我们需要的工具。
基本概念
组合对象
组合对象指满足某一性质的树、图、串等可计数的对象。组合对象组成的集合成为组合类。
对于组合类
,其中每个对象 都被定义了一个 “大小” ,可能代表节点个数,串长等。
约定使用字体
表示组合类, 代表空对象,大小为 , )
组合对象的拼接
组合对象
的乘法 被定义为两者的有序拼接,可以记作 或有序对 。 对于两个组合对象
的拼接 ,定义 。
该定义是自然的。例如两个长度为
组合类的加法:不交并
若组合类
不交,则 定义为 。
为了书写方便,有时将单个组合对象自动视为集合。
组合类的乘法:笛卡尔积
定义
为组合类 的笛卡尔积,记作 ,即为从两个集合中各取一个元素先后拼接形成的集合。
例:若
不难发现
我们已经对组合类(集合,元素有大小)和组合结构(不交并,笛卡尔积等)进行了定义,下面来看两个例子。
01 串
记 01 串的组合类为
,将其内容用无穷求和的方式写出: 对于某个 01 串,要么为空,要么是由 0 或 1 开头,接上另一个(可空)01 串而得。
写成组合符号,即
这个式子概括了
的组合结构。不过,我们目前尚不能进一步处理它。 有序二叉树(卡塔兰数)
定义有根有序二叉树满足:有根,儿子有左右之分。下图列出了前
棵非空有根有序二叉树: 一棵有根二叉树要么为空,要么由“左儿子,根,右儿子”三部分组成。则有:
其中
,表示单个节点(根节点)。这个式子概括了 的组合结构。
需要特别解释的是,这里的“组合等式”,也就是组合类之间的等式,并不是指“严格相等”,而是指“互为双射”。
例如
组合对象与生成函数
将所有大小为
例如:定义
如果我们只对
定义组合类
组合类运算对应着怎样的生成函数运算呢?不难发现:
组合对象的乘法对应幂表示的乘法:
的幂表示为 ,等于 的幂表示 之积。 组合类的加法对应生成函数的加法。
组合类的笛卡尔积对应生成函数的乘法:
利用乘法运算律
可以验证。
综上,我们有
上一小节说明了,OGF 的乘法和计数背包的转移(加法卷积)是同构的。因此,我们其实早在学习 背包 DP 时就已经熟悉了笛卡尔积的代数形式。
回看“基本概念”中的两个例子,将得到的组合方程翻译为生成函数:
01 串
解得
, ,即长为 的 01 串有 个。 有序二叉树(卡塔兰数)
解得
,正是卡塔兰数的生成函数。
从组合对象到幂表示
下面来看一个广为流传的,动的“由组合对象变为幂级数”的例子,它对我们的理解大有裨益。我们将首先用特殊的符号写出组合对象,并展示它们一步步简化成
骨牌密铺
- 用
的骨牌铺满 的矩形,有多少种方案?
用
目前
定义两种铺设方案的乘法为顺次拼接,如
注意到,对于某种铺设方案
比如,我们并不关心具体铺设顺序,只关心使用横竖骨牌的个数,则可以将每种铺设方案拆散,如
此时,
这里
对封闭形式进行改写,有
进一步地,如果我们不关心骨牌的方向,只关心个数,则用
的含义
关于形式幂级数,总有个老生常谈的问题:
有些人可能会回答:“
在学习了组合对象的幂表示之后,我们有了另一种理解:生成函数中的
(无标号)组合构造
复杂的组合类往往由其他组合类构造得来,一个构造是从一个组合类映射到一个组合类的函数。
生成函数的定义已经翻译了 “集合不交并”,“笛卡尔积” 这两个最基本的构造。下面让我们继续来看,在生成函数的视角中,各色组合构造会有怎样的形式。
Sequence 构造
对于组合类
,定义 “生成不定长序列” 构造为: 又作 ,即用若干 中元素拼成有序序列。 此处要求
,否则求和不收敛。
翻译成生成函数,有
01 串
记
。 01 串可以看作 0,1 生成的序列,即 。 则 斐波那契数列
可以视作用长度为 的骨牌铺满 的区域的方案数。 记
, 。则
无标号 Amplification 构造
组合类
的“k-膨胀构造”定义为: 大意是说,
中的元素都是 中某个元素复读 次的结果,你也可以理解成所有元素的大小都扩大 倍。
翻译成生成函数,在幂表示中将
置换群下的等价类
组合类
令
组合对象
例:
串。令
为全体置换组成的置换群列。记 为 01 串的组合类。 在 上拆分的结果为 , 。由于可以任意置换,
可置换成 ,故 和 在 上等价。当
为全体环置换(循环位移)时,两者不等价。
对于组合对象
定义
例:01 串。
仍记
, 为 01 串的组合类, 为全体置换,有 为了方便和直观,我们从等价类 中抽取一个(字典序最小的)元素代表 。如 实际上代表了 。
Multiset 构造(完全背包)
- 令
为全体置换组成的置换群列。定义“生成(无序)集合构造”为:
在
不妨为
于是,按某种顺序枚举
至于计算,尝试取
稍作代换可以得到另一个有趣的式子:
记
模板: Luogu4389 付公主的背包
- 定义“生成(无序)k-集合构造”为:
考虑
朴素地计算,置换高达
Cycle 构造
- 令
为全体环置换组成的置换群列。定义“生成(无标号)环构造”为:
为了便于理解,可以将
例:01 环的组合类为
其中
代表等价类
接下来考虑如何将组合式翻译为生成函数。
先分析
枚举
根据 Burnside 引理,置换下的等价类个数等于置换下不动点的平均数,有
对各个
Power Set 构造(01 背包)
定义“生成(无序)幂集构造”为:
即枚举每个元素是否存在。也可以粗略地理解为:
。实际上, 的组合意义就是 背包。
将组合式改写为生成函数,则有:
计算时仍然取
求和可以
记
有标号对象与 EGF
标号的概念
复杂的组合对象可能由更基本的元素构成,如“无向图”由点和边构成。这些组合对象的“大小”常常被定义为所含某种元素的个数,这种元素被称为主要元素,如无向图的大小被定义为其节点数,“节点”是其主要元素。
有些时候,对于组合对象
例如无标号无向图和有标号无向图,它们判断相等的方法是不同的:
下图展示了所有
有标号对象的基本运算
我们将从头开始定义“有标号组合对象”、“有标号组合构造”,并将其翻译为生成函数。
对于有标号组合对象
考虑有标号组合对象
考虑两张有标号无向图
我们将这一过程称作有标号对象的“归并”。
如上图,有标号对象的归并的方式不止一种,主要是标号的方案不止一种。我们需要将标号集合
例如将
这得到上面产生的第二个图。
划分标号的方案有
为什么叫做归并呢?考虑两个序列
排第 位, 的新标号为 。 排第 位, 的新标号为 。 排第 位, 的新标号为 。 排第 位, 的新标号为 。
这样也产生第二个图。
总而言之,两个有标号组合对象
进一步地,两个组合类的笛卡尔积定义为
对于有标号组合对象
于是,定义有标号组合类
有标号组合构造
有标号 Sequence 构造
“生成序列构造”定义为:
或 。要求
,否则求和不收敛。
类似无标号的情况
Pointing 构造
组合意义是选择一个元素作为特殊元素(如选择图的根)。
不难发现,若
置换群下的等价类
“无标号组合构造”中定义了记号
对于某置换群列
先考虑
可以发现,对任意一个序列
综上可见,在有标号计数中,“除去一个置换群列”是简单的。
Set 构造
- 记
为全体置换组成的置换群列(即允许元素任意打乱),“生成集合构造”定义为:
易知
例1:有标号连通图。
记有标号图的集合为
,有标号连通图的集合为 ,则 。翻译为生成函数,
, ,只需求 即可。例2:贝尔数。
为将标号 划分为若干非空无序集的方案数。记非空集合的组合类为
, , (显然,对于任意 ,大小为 的有标号无序集就只有 一种), 。记集合划分的组合类为
,则 ,故 。
有标号 Cycle 构造
- 记
为全体旋转置换,“生成环构造”定义为:
易知
此外,若
有标号组合类的复合
标号无关
定义一个组合类
是“标号无关的”,当且仅当:对于任意 ,将标号任意打乱后得到 ,仍有 。反之,则称
是“标号有关的”。
例如:
令
则
是“标号有关”的。令
为有标号无向连通图,则 是“标号无关的”,因为打乱标号不影响是否连通。(我们研究的绝大多数性质都属此类)
复合积
现有一个有标号组合对象
满足 ,又有一个序列 ,记两者的复合为 。它是一个组合对象,大小是 ,含义是:对 ,将 中编号为 的元素换成序列 中的第 个对象 ,且在 上保留注释“ ”。替换后, 本身不再占据大小。记
这一运算称作“复合积”。
例如,令
选择
;选择
;将
中的标号 替换为 ,标号 替换为 ,同时保留原标号注释,得到 。
然而,在实际问题中,我们往往不希望保留
复合对象在置换群下的等价类
对于两个复合对象
,满足 ,用全体 元置换 来任意打乱 的标号,若能使得两者相等,则称两者等价。记
为全体置换,定义 为等价类的集合。
这作用相当于将
子结构构造(Substitution 构造)
现有组合类
,其中 是“标号无关的”,记 为全体置换,定义“子结构构造”为:
考虑计数。首先观察
对于
在有标号计数中,诸多组合构造都能由 Subsitution 构造导出。
构造大小为
的有标号序列有 个。记 为有标号序列, 为序列的 EGF,有 若 ,则 构造大小为
的有标号环有 个。记 为有标号环, 为环的 EGF,有 若 ,则 构造大小为
的有标号无序集合只有 个。记 为有标号无序集合, 为其 EGF,有 若 ,则
相比面相置换群的推导,它们更简单直接。
Erase/Rewrite 构造
操作末标号
对于有标号组合对象,定义:
擦去最大的标号,对应元素变为无标号元素。 写回最大的标号。
例:对于
具体地(用
注意,不能对双方都进行
当然,
有根组合对象
若组合对象有且仅有一个元素是特殊的(可以认为有一个无大小的标记),称作根,则该组合对象为“有根对象”,对应的组合类为“有根组合类”。
称根元素的标号为“根标号”。
操作根标号
对于标号无关的有根组合对象,定义组合变换:
删除根的标号,根元素变成无标号元素,其余元素标号离散化。 恢复根的标号。
例如,记
有
接下来考虑计算。对于有根组合类
由此,记
写成生成函数的形式,恰好是乘除
- 例:非空有标号有根树删除根,就变成一个无标号根下的有标号森林,与有标号森林一一对应。记“非空有标号有根”为
,“可空有标号森林”为 ,则