符号化方法小记
zhiyangfan
·
·
个人记录
符号化方法
OI wiki 新增加的一页,在 GF 计数领域非常有用,所以总结一下。
一些符号约定
符号化方法是把组合对象(比如树,字符串,图等我们关心它组合意义的东西)转化为 GF 形式表达的一种方法,考虑把在这些组合对象组成的集合上进行的操作,变成在 GF 上进行的操作,从而大大提升效率。一般地,我们定义组合类:
(\mathcal{A},\lvert\cdot\rvert)
其中 \mathcal{A} 为组合对象组成的集合,\lvert\cdot\rvert 是一个单元操作,把一个组合对象映射为一个非负整数。举个例子,比如对于一棵树,我们关心它的结点数,所以就定义 |t| 为 t 这棵树的结点数量。我们定义 \mathcal{A}_n=\{\alpha\in\mathcal{A}||\alpha|=n\}。
对于组合类 (\mathcal{A},\lvert\cdot\rvert) ,其对应的 OGF 为:
A(z)=\sum_{\alpha\in \mathcal{A}}z^{|\alpha|}=\sum_{n\ge 0}a_nz^n
对应的 EGF 为:
\hat{A}(z)=\sum_{\alpha\in \mathcal{A}}\dfrac{z^{|\alpha|}}{|\alpha|!}=\sum_{n\ge 0}\dfrac{a_nz^n}{n!}
其中 a_n=\operatorname{card}(\mathcal{A}_n),\operatorname{card} 表示集合的基数。一般来说,OGF 用于无标号的情况,EGF 用于有标号的情况。
定义中性对象 \epsilon 满足 |\epsilon|=0,和中性集合 \mathcal{E}=\{\epsilon\},其对应的 OGF,EGF 为:
\mathcal{E}(z)=\hat{\mathcal{E}}(z)=1
定义原子对象 \circ 满足 \lvert\circ\rvert=1,和原子集合 \mathcal{Z}=\{\circ\},其对应的 OGF,EGF 为:
\mathcal{Z}(z)=\hat{\mathcal{Z}}(z)=z
显然我们能得到结论,\forall\mathcal{A},都有 \mathcal{A}\cong\mathcal{A}\times\mathcal{E}\cong\mathcal{E}\times \mathcal{A},其中我们称两个组合集 \mathcal{A},\mathcal{B} 满足 \mathcal{A}\cong\mathcal{B} 当且仅当它们不平凡同构。
无标号
本部分介绍的所有操作是基于无标号的,所以对应的 GF 均采用 OGF。
不相交并
对于两个组合类的并 \mathcal{A},\mathcal{B},如果我们单纯将它记为:
\mathcal{A}+\mathcal{B}
即简单的拼接,如果 \mathcal{A}\cap\mathcal{B}\ne\emptyset,就会与不相交的前提相违背。所以我们把它记为:
(\mathcal{E}_1\times\mathcal{A})+(\mathcal{E}_2\times\mathcal{B})
即给两个乘上不同的中性对象,不改变集合的元素本质,但给它们“染上了颜色”,从而不管是否有 \mathcal{A}\cap\mathcal{B}=\emptyset,都可以直接拼接。而对应的 OGF 为:
A(z)+B(z)=\sum_{\alpha\in\mathcal{A}}z^{|\alpha|}+\sum_{\beta\in\mathcal{B}}z^{|\beta|}=\sum_{n\ge 0}(a_n+b_n)z^n
即两个集合对应 OGF 的幂级数加法。
笛卡尔积
我们定义两个集合的笛卡尔积 \mathcal{A}\times\mathcal{B} 为:
\mathcal{A}\times\mathcal{B}=\{(\alpha,\beta)|\alpha\in\mathcal{A},\beta\in\mathcal{B}\}
其中如果 \gamma=(\alpha_1,\alpha_2,\cdots,\alpha_n),则我们记 |\gamma|=|\alpha_1|+|\alpha_2|+\cdots+|\alpha_n|。通过定义可以找到对应的 OGF:
A(z)B(z)=\sum_{(\alpha,\beta)\in(\mathcal{A}\times\mathcal{B})}z^{|\alpha|+|\beta|}=\sum_{n\ge 0}\sum_{i+j=n}a_ib_jz^n
即两个集合对应 OGF 的幂级数乘法。
序列构造
我们定义一个集合的序列构造 \operatorname{SEQ}(\mathcal{C}) 为:
\operatorname{SEQ}(\mathcal{C})=\{\epsilon\}+\mathcal{C}+\mathcal{C}^2+\mathcal{C}^3+\cdots
其中为了保证构造出的集合合理,必须有 \mathcal{C}_0=\emptyset。感性理解就是在这个集合里选 0 个的方案,选 1 个的方案,选 2 个的方案等等的并,且选择组成的是序列,即顺序有所谓。对应的 OGF 为:
\operatorname{SEQ}(C(z))=\sum_{n\ge 0}C^n(z)=\dfrac{1}{1-C(z)}
循环构造
我们定义一个集合的循环构造 \operatorname{CYC}(\mathcal{B}) 为:
\operatorname{CYC}(\mathcal{B})=\operatorname{SEQ}(\mathcal{B})/\mathbf{S}
其中 \mathbf{S} 为一个等价关系,表示二者循环同构,/\mathbf{S} 表示把原集合按照在这个等价意义下等价的元素剔除。感性理解就是在 \operatorname{SEQ}(\mathcal{B}) 的集合中,去掉循环同构的序列。其对应的 OGF 不那么显然,根据 OI wiki,式子是:
\operatorname{CYC}(B(z))=\sum_{n\ge 1}\dfrac{\varphi(n)}{n}\ln\dfrac{1}{1-B(z^n)}
其中 \varphi 为欧拉函数。
可重集构造
我们定义一个集合的可重集构造 \operatorname{MSET}(\mathcal{A}) 为:
\operatorname{MSET}(\mathcal{A})=\operatorname{SEQ}(\mathcal{A})/\mathbf{R}
其中 \mathbf{R} 为一个等价关系,表示两个序列对应同一个可重集,/\mathbf{R} 表示把原集合按照该等价关系相同的元素剔除。感性来看就是在序列构造的基础上,要求组成的是可重集,即顺序无所谓。除定义外,我们还能得到这样的递推式:
\operatorname{MSET}(\{\alpha_0,\alpha_1,\cdots\alpha_n\})=\operatorname{MSET}(\{\alpha_0,\alpha_1,\cdots\alpha_{n-1}\})\times\operatorname{SEQ}(\{\alpha_n\})
表示在原有的生成的可重集内,每个都加入若干个 \alpha_n。更进一步,我们能发现:
\operatorname{MSET}(\mathcal{A})=\prod_{\alpha\in\mathcal{A}}\operatorname{SEQ}(\{\alpha\})
因为 \operatorname{SEQ} 对应的 OGF 已知,所以 \operatorname{MSET} 对应的 OGF 为:
\operatorname{MSET}(A(z))=\prod_{\alpha\in\mathcal{A}}(1-z^{|\alpha|})^{-1}=\prod_{n\ge 1}(1-z^n)^{-a_n}
不要忘了 \operatorname{SEQ} 要求不能出现大小为 0 的元素。
进一步地,我们还能通过取对数继续化简这个 OGF(具体过程可以参考我的 一篇题解):
\operatorname{MSET}(A(z))=\exp\left(\sum_{n\ge 1}\dfrac{A(z^n)}{n}\right)
可重集构造又被称作 Euler 变换。
幂集构造
我们定义一个集合的幂集构造 \operatorname{PSET}(\mathcal{B}) 为其所有子集的并。有递推式:
\operatorname{PSET}(\{\beta_0,\beta_1,\cdots,\beta_n\})=\operatorname{PSET}(\{\beta_0,\beta_1,\cdots,\beta_{n-1}\})\times(\{\epsilon,\beta_n\})
即剩下一个元素可以选,也可以不选。进一步地,我们有:
\operatorname{PSET}(\mathcal{B})=\prod_{\beta\in\mathcal{B}}(\{\epsilon,\beta\})
对应的 OGF 为:
\operatorname{PSET}(B(z))=\prod_{\beta\in\mathcal{B}}(1+z^{|\beta|})=\prod_{n\ge 1}(1+z^n)^{b_n}
可以发现与 \operatorname{MSET} 的非常像,仅仅是换了几个符号,所以另一种 \exp 的形式也可以类似地得出:
\operatorname{PSET}(B(z))=\exp\left(\sum_{n\ge 1}\dfrac{(-1)^{n-1}B(z^n)}{n}\right)
根据定义容易得到:
\operatorname{PSET}(\mathcal{B})\subset\operatorname{MSET}(\mathcal{B})
带限制的情况
上面所有的讨论都是基于不限组成部分的情况,但如果要求原序列生成的可重集个数满足某种限制——比如恰为 k——那就无法解决了。定义 \mathfrak{K} 为上述 \operatorname{SEQ,MSET,PSET,CYC} 的其中的一种操作,定义以下三种限制:
\mathfrak{K}_{\ge l}(\mathcal{B})\qquad\mathfrak{K}_{k}(\mathcal{B})\qquad\mathfrak{K}_{l..r}(\mathcal{B})
为组成部分大于等于 l,恰等于 k,和位于 l..r 中。以 \mathcal{A}=\mathfrak{K}_{l..r}(\mathcal{B}) 为例,这要求:
\forall\alpha\in\mathcal{A},\alpha=\{(\beta_0,\beta_1,\cdots,\beta_k)|\beta\in\mathcal{B}\},l\le k\le r
考虑引入二元 GF 来解决这个问题,如果设 \mathcal{X}(\alpha) 表示组成 \alpha 的元素个数,则我们定义 A_{n,k} 为:
A_{n,k}=\operatorname{card}(\{\alpha\in\mathcal{A}||\alpha|=n,\mathcal{X}(\alpha)=k\})
则对应的二元 GF 为:
A(z,u)=\sum_{n,k}A_{n,k}u^kz^n=\sum_{\alpha\in\mathcal{A}}u^{\mathcal{X}(\alpha)}z^{|\alpha|}
容易发现,\mathfrak{K}_{l..r} 的限制只需要提取出 u^{l..r} 的系数,就能得到对应的 OGF,其他两个限制是类似的。
具体来看,对于 \operatorname{SEQ}(\mathcal{B}):
A(z,u)=\sum_{n,k}A_{n,k}z^nu^k=\sum_{k\ge 0}B^k(z)u^k=\dfrac{1}{1-uB(z)}
其中 A_{n,k}z^n=B^k(z) 是由于对于 \operatorname{SEQ} 构造,B(z)^k 就表示组成部分为 k 个的 OGF。这样显然有:
[u^l]A(z,u)=B^l(z)
对于 \operatorname{MSET}(\mathcal{B}):
A(z,u)=\prod_{n}(1-uz^n)^{-b_n}
只是给每一个元素增加了一个 u,表示这个元素单独的时候表示 1 个元素,从而两个相乘表示拼接的时候也会把 u 的指数相加。可以用类似的方法得到 \exp 形式:
A(z,u)=\exp\left(\sum_{n\ge 1}\dfrac{u^nB(z^n)}{n}\right)
把 \exp 展开后即可提取 u^l 的系数。
注意在这种情况下,对于 b_0 的定义很重要。如果 b_0=1,则有可能出现较多的常数项不便于计算。
对于 \operatorname{PSET}(\mathcal{B}),可以采用类似的思路:
A(z,u)=\prod_{n}(1+uz^n)^{b_n}
$$A(z,u)=\exp\left(\sum_{n\ge 1}\dfrac{(-1)^{n-1}u^nB(z^n)}{n}\right)$$
依然是把 $\exp$ 展开提取系数。
#### 一些例题
> [loj#6268. 分拆数](https://loj.ac/p/6268)
>
> 定义 $f(i)$ 为把 $i$ 表示成若干正整数之和的方案数,正整数之间的顺序无所谓。求 $f(1\sim10^5)$,答案对 $998,244,353$ 取模。
如果我们定义组合类 $(\mathcal{I},\lvert\cdot\rvert)$,其中 $\mathcal{I}=\mathbb{N}_+$,$\lvert i \rvert=i$,则我们发现题目里给出的分拆其实相当于:
$$\operatorname{MSET}(\mathcal{I})$$
因为不同的数组成成一个新的组合类,它的大小恰等于各个组分之和,即对于正整数的分拆,又因为顺序无所谓,所以用 $\operatorname{MSET}$。具体算的方法,可以考虑把 $\operatorname{MSET}$ 的形式展开一下:
$$\operatorname{MSET}(I(z))=\exp\left(\sum_{n\ge 1}\dfrac{I(z^n)}{n}\right)=\exp\left(\sum_{n\ge 1}\sum_{k\ge 1}\dfrac{i_kz^{kn}}{n}\right)$$
这样每个 $i_k$ 会对所有 $k$ 的倍数做贡献,枚举倍数预处理出多项式就可以直接做 $\exp$ 了,时间复杂度 $\mathcal{O}(n\log n)$。
```cpp
int main()
{
int n, m = 1; scanf("%d", &n); while (m <= n) m <<= 1;
for (int i = 1; i <= n; ++i)
for (int j = i; j < m; j += i) (F[j] += ksm(j / i, mod - 2)) %= mod;
getExp(F, G, m);
for (int i = 1; i <= n; ++i) printf("%d\n", G[i]);
return 0;
}
```
> [洛谷 P5900 无标号无根树计数](https://www.luogu.com.cn/problem/P5900)
>
> 求 $n$ 个点的无标号无根树数量,答案对 $998244353$ 取模。($1\le n\le 2\times10^5$)
发现如果我们求的是有根树,则钦定一个根后,剩下的点其实是分成若干集合,变成子树,且各个子树又是递归结构。所以定义组合类 $(\mathcal{T},\lvert\cdot\rvert)$,其中 $\mathcal{T}$ 表示所有无标号有根树的集合,$|t|$ 表示这棵树结点大小,则:
$$\mathcal{T}=\{\circ\}\times\operatorname{MSET}(\mathcal{T})$$
展开成 OGF 就可以做了:
$$\operatorname{MSET}(T(z))=z\exp\left(\sum_{n\ge1}\dfrac{T(z^n)}{n}\right)$$
具体做法见我的 [一篇题解](https://www.luogu.com.cn/blog/i-am-zhiyangfan/solution-p5900)。
> [烷基计数 加强版 加强版](https://loj.ac/p/6538)
>
> 求 $n$ 个点的每个点度数不超过 $4$ 且根的度数不超过 $3$ 的有根树的数目。($1\le n\le 10^5$)
这道题一个显然的想法是设组合类 $(\mathcal{T},\lvert\cdot\rvert)$,与上一道题类似的意义,有等式:
$$\mathcal{T}=\{\circ\}\times\operatorname{MSET}_{0..3}(\mathcal{T})$$
不幸的是,如果按照这个等式进行 OGF 的展开,会得到一个非常长的式子,非常不便于计算。注意到这个等式必须要求 $\operatorname{MSET}$ 取 $0..3$ 是因为 $\mathcal{T}$ 内没有 $\epsilon$ 元素,这样的话,满足度数 $\le 3$ 就必须显式表示。而如果我们定义 $\hat{\mathcal{T}}=\mathcal{T}+\{\epsilon\}$,则会有:
$$\hat{\mathcal{T}}=\{\epsilon\}+\{\circ\}\times\operatorname{MSET}_3(\hat{\mathcal{T}})$$
而这个式子展开就会方便很多了。考虑把 $\exp$ 展开:
$$\begin{aligned}\operatorname{MSET}_3(T(z))&=[u^3]\exp\left(\sum_{n\ge 1}\dfrac{u^nT(z^n)}{n}\right)\\&=[u^3]\sum_{i\ge 0}\dfrac{\left(\sum_{n\ge 1}\dfrac{u^nT(z^n)}{n}\right)^i}{i!}\\&=[u^3]1+[u^3]\left(\cdots+\dfrac{u^3T(z^3)}{3}+\cdots\right)+[u^3]\dfrac{\left(\dfrac{uT(z)}{1}+\dfrac{u^2T(z^2)}{2}+\cdots\right)^2}{2}\\&+[u^3]\dfrac{\left(\dfrac{uT(z)}{1}+\cdots\right)^3}{6}\\&=\dfrac{T(z^3)}{3}+\dfrac{T(z)T(z^2)}{2}+\dfrac{T^3(z)}{6}\end{aligned}$$
这样能得到:
$$T(z)=1+\dfrac{z}{6}(2T(z^3)+3T(z)T(z^2)+T^3(z))$$
可以用半在线卷积或者牛顿迭代分别在 $\mathcal{O}(n\log^2n)$ 和 $\mathcal{O}(n\log n)$ 的时间内求解。
```cpp
inline void copy(int* f, int* g, int n) { for (int i = 0; i < n; ++i) g[i] = f[i]; }
inline void clear(int* f, int n) { for (int i = 0; i < n; ++i) f[i] = 0; }
inline void cdq(int l, int r)
{
if (l + 1 == r) return (l % 3 == 1) ? ((A[l] += (ll)A[l / 3] * inv3 % mod) %= mod, void()) : void();
int mid = (l + r) >> 1; cdq(l, mid); init(r - l);
copy(A + l, F, mid - l); clear(F + mid - l, lim - mid + l);
copy(A, G, r - l); clear(G + r - l, lim - r + l);
for (int i = 0; i < lim; ++i) H[i] = 0;
for (int i = 0; i < r - l; ++i) if (!(i & 1)) H[i] = A[i / 2];
NTT(F, lim, 1); NTT(G, lim, 1); NTT(H, lim, 1);
for (int i = 0; i < lim; ++i)
F[i] = ((ll)F[i] * H[i] % mod * inv2 % mod + (ll)F[i] * G[i] % mod * G[i] % mod * inv2 % mod * (!l ? inv3 : 1) % mod) % mod;
NTT(F, lim, mod - 2);
for (int i = mid; i < r; ++i) (A[i] += F[i - l - 1]) %= mod;
cdq(mid, r);
}
int main()
{
int m; scanf("%d", &m); while (n <= m) n <<= 1; A[0] = 1;
cdq(0, n); printf("%d\n", A[m]); return 0;
}
```
顺便提一句,如果按照 $\mathcal{T}=\{\circ\}\times\operatorname{MSET}_{0..3}(\mathcal{T})$ 展开得到的是:
$$T(z)=\dfrac{z}{6}(1+6T(z)+3T^2(z)+3T(z^2)+3T(z)T(z^2)+2T(z^3)+T^3(z))$$
如果把 $T(z)$ 换为 $T(z)+1$,那就跟上面那个式子一样了。所以常数项一般来说处理为 $0$ 会更加方便,甚至有时候必须处理为 $0$(比如上题无标号无根树,因为没有限制,所以一旦不处理为 $0$,那常数项就会爆炸)
### 有标号
本部分介绍的所有内容是基于有标号的,所以对应的 GF 采用 EGF。
#### 一些有标号的例子
对于排列组成的组合类 $(\mathcal{P},\lvert\cdot\rvert)$,定义 $|p|$ 为排列的长度,则其 EGF 为:
$$\hat{P}(z)=\sum_{p\in\mathcal{P}}\dfrac{z^{|p|}}{|p|!}=\sum_{n\ge 0}\dfrac{n!z^n}{n!}=\dfrac{1}{1-z}$$
对于圆排列组成的组合类 $(\mathcal{C},\lvert\cdot\rvert)$,定义 $|c|$ 为圆排列的长度,则其 EGF 为:
$$\hat{C}(z)=\sum_{c\in\mathcal{C}}\dfrac{z^{|c|}}{|c|!}=\sum_{n\ge 0}\dfrac{(n-1)!z^n}{n!}=\ln\dfrac{1}{1-z}$$
能看出 $\exp \hat{C}(z)=\hat{P}(z)$。
对于图 $G=(V,E)$,且 $|E|=0$,定义其组合类 $(\mathcal{U},\lvert\cdot\rvert)$,定义 $|u|=|V|$,则其 EGF 为:
$$\hat{U}(z)=\sum_{u\in\mathcal{U}}\dfrac{z^{|u|}}{|u|!}=\sum_{n\ge 0}\dfrac{z^n}{n!}=e^z$$
这是由于完全没有边的图,相同大小的点集仅对应一个。
#### 集合的有标号乘法
首先我们要知道,把两个元素做有标号乘法会有什么结果。比如 $\beta,\gamma$ 为两个有标号元素,则我们定义二者的有标号乘法为这两个元素拼接在一起,**并重新标号**。而对一个元素重新标号有两种情况,要么是把标号的值域扩大,要么缩小,这导出了对元素有标号乘法两种等价的定义:
$$\beta\ast\gamma=\{(\beta',\gamma')|(\beta',\gamma') 的标号是良定义的,\rho(\beta')=\beta,\rho(\gamma')=\gamma\}$$
其中 $\rho$ 表示将标号的值域缩小后的对应。
$$\beta\ast\gamma=\{(e(\beta),f(\gamma))|\operatorname{Im}(e)\cap\operatorname{Im}(f)=\emptyset,\operatorname{Im}(e)\cup\operatorname{Im}(f)=\{1,2,\cdots,|\beta|+|\gamma|\}\}$$
其中 $f,e$ 表示将标号的值域扩大后的对应,$\operatorname{Im}(e)$ 表示对应到的值的集合。可能有点难理解,举个例子吧,比如将一个三角形 $1-2-3$ 和一个线段 $1-2$ 乘在一起会得到 $10$ 个结果:
$$\begin{aligned}&(1-2-3,4-5),(1-2-4,3-5),(1-2-5,3-4),(1-3-4,2-5),(1-3-5,2-4)\\&(1-4-5,2-3),(2-3-4,1-5),(2-3-5,1-4),(2-4-5,1-3),(3-4-5,1-2)\end{aligned}$$
可以观察到,两个集合 $\beta,\gamma$ 大小分别为 $n_1,n_2$,如果令 $n=n_1+n_2$,则:
$$\operatorname{card}(\beta\ast\gamma)=\dbinom{n}{n_1,n_2}$$
有了这个定义,我们就能得到两个集合的有标号乘法 $\mathcal{B}\ast\mathcal{C}$ 为:
$$\mathcal{B}\ast\mathcal{C}=\bigcup_{\beta\in\mathcal{B},\gamma\in\mathcal{C}}(\beta\ast\gamma)$$
对应的 EGF 操作为:
$$\hat{A}(z)=\hat{B}(z)\times \hat{C}(z)\iff a_n=\sum_{|\beta|+|\gamma|=n}\dbinom{|\beta|+|\gamma|}{|\beta|,|\gamma|}=\sum_{n_1+n_2=n}\dbinom{n}{n_1,n_2}b_{n_1}c_{n_2}$$
其中:
$$\dbinom{n}{n_1,n_2,\cdots,n_k}=\dfrac{n!}{n_1!n_2!\cdots n_k!}$$
即 EGF 的幂级数乘法。容易发现这个乘法满足结合律:
$$\mathcal{A}\ast(\mathcal{B}\ast\mathcal{C})=(\mathcal{A}\ast\mathcal{B})\ast\mathcal{C}$$
#### 序列构造
我们定义一个集合的序列构造 $\operatorname{SEQ}(\mathcal{B})$ 为:
$$\operatorname{SEQ}(\mathcal{B})=\{\epsilon\}+\mathcal{B}+\mathcal{B}^2+\mathcal{B}^3+\cdots$$
其中 $\mathcal{B}^n=(\mathcal{B}\ast\mathcal{B}\ast\mathcal{B}\ast\cdots)$,共 $n$ 个 $\mathcal{B}$。定义 $k$ 序列构造 $\operatorname{SEQ}_k(\mathcal{B})$ 为:
$$\operatorname{SEQ}_k(\mathcal{B})=\mathcal{B}^k$$
可以找到对应的 EGF:
$$\operatorname{SEQ}(\hat{B}(z))=\dfrac{1}{1-\hat{B}(z)},\operatorname{SEQ}_k(\hat{B}(z))=\hat{B}^k(z)$$
$\operatorname{SEQ}$ 构造依然要求 $\mathcal{B}_0=\emptyset$。
感性理解就是选取 $0,1,2,\cdots$ 个元素构成的有标号,顺序有所谓的序列。
#### 集合构造
我们定义一个集合的集合构造 $\operatorname{SET}(\mathcal{B})$ 为:
$$\operatorname{SET}(\mathcal{B})=\{\epsilon\}+\mathcal{B}+\operatorname{SET}_1(\mathcal{B})+\operatorname{SET}_2(\mathcal{B})+\cdots=\bigcup_{k\ge 0}\operatorname{SET}_k(\mathcal{B})$$
其中 $k$ 集合构造 $\operatorname{SET}_k(\mathcal{B})=\operatorname{SEQ}_k(\mathcal{B})/\mathbf{R}$,$\mathbf{R}$ 为等价关系,表示两个序列中一个是另一个的排列,$/\mathbf{R}$ 表示去掉等价的元素。可以找到对应的 EGF:
$$\operatorname{SET}_k(\hat{B}(z))=\dfrac{1}{k!}\hat{B}^k(z),\operatorname{SET}(\hat{B}(z))=\sum_{k\ge 0}\dfrac{1}{k!}\hat{B}^k(z)=\exp (\hat{B}(z))$$
注意到所有东西都是有标号的,所以所有的数都是不同的,这样的话,$\operatorname{MSET,PSET}$ 都会对应到 $\operatorname{SET}$,即它们都是等价的。感性理解就是选取 $0,1,2,\cdots$ 个元素构成的有标号,顺序无所谓的序列。
#### 循环构造
我们定义一个集合的循环构造 $\operatorname{CYC}(\mathcal{B})$ 为:
$$\operatorname{CYC}(\mathcal{B})=\{\epsilon\}+\operatorname{CYC}_1(\mathcal{B})+\operatorname{CYC}_2(\mathcal{B})+\cdots=\bigcup_{k\ge 0}\operatorname{CYC}_k(\mathcal{B})$$
其中 $k$ 循环构造 $\operatorname{CYC}_k=\operatorname{SEQ}_k/\mathbf{S}$,$\mathbf{S}$ 为等价关系,表示两个序列循环同构。这样可以找到对应的 EGF:
$$\operatorname{CYC}_k(\hat{B}(z))=\dfrac{1}{k}\hat{B}^k(z),\operatorname{CYC}(\hat{B}(z))=\sum_{k\ge 0}\dfrac{1}{k}\hat{B}^k(z)=\ln\dfrac{1}{1-\hat{B}(z)}$$
通过以上这些操作,我们可以构造出一开始举出的三个例子 $\mathcal{U,P,S}$:
$$\mathcal{P}=\operatorname{SEQ}(\mathcal{Z}),\mathcal{U}=\operatorname{SET}(\mathcal{Z}),\mathcal{C}=\operatorname{CYC}(\mathcal{Z})$$
受这个启发,可以构造出的更多操作
#### 满射
满射,即从集合 $\mathcal{A}$ 到集合 $\mathcal{B}$ 的一种函数,且每个值至少用到一次。我们定义满射集合 $\mathcal{R}$ 为:
$$\mathcal{R}=\operatorname{SEQ}\{\operatorname{SET}_{\ge 1}(\mathcal{Z})\}$$
如果给出一个 $r\ge 1$,我们定义 $\mathcal{R}^{(r)}_n$ 为从 $[1\cdots n]$ 到 $[1\cdots r]$ 的满射的集合,一个例子 $\mathcal{R}_9^{(5)}$ 的元素之一:
$$\phi=(1\rightarrow \mathbf{2},2\rightarrow\mathbf{1},3\rightarrow\mathbf{2},4\rightarrow\mathbf{3},5\rightarrow\mathbf{5},6\rightarrow\mathbf{3},7\rightarrow\mathbf{5},8\rightarrow\mathbf{3},9\rightarrow\mathbf{4})$$
注意如果把 $9\rightarrow\mathbf{4}$ 换为 $9\rightarrow\mathbf{3}$,$\phi$ 就不是个满射。此外,我们定义:
$$\mathcal{R}^{(r)}=\bigcup_{n}\mathcal{R}_{n}^{(r)}$$
注意到 $\mathcal{R}^{(r)}$ 可以用一个 $r$ 元组集合,且它们的并集是 $A$ 集合表示:
$$(\phi^{-1}(1),\phi^{-1}(2),\cdots,\phi^{-1}(r))$$
即 $B$ 集合对应的 $A$ 集合的元素的集合,上面举的例子就是:
$$(\{2\},\{1,3\},\{4,6,8\},\{9\},\{5,7\})$$
这样就可以找到对应的 EGF 了:
$$\mathcal{R}^{(r)}=\operatorname{SEQ}_r\{\operatorname{SET}_{\ge 1}(\mathcal{Z})\}\Rightarrow \hat{R}^{(r)}(z)=(e^z-1)^r$$
这样 $n![z^n]\hat{R}^{(r)}=R^{(r)}_n$,二项式定理爆拆:
$$R_n^{(r)}=n![z^n]\sum_{j=0}^r\dbinom{r}{j}(-1)^je^{(r-j)z}=\sum_{j=0}^r\dbinom{r}{j}(-1)^j(r-j)^n$$
注意到 $\mathcal{R}=\operatorname{SEQ}(\operatorname{SET}_{\ge 1}(\mathcal{Z}))$,这样可以导出:
$$\hat{R}(z)=\dfrac{1}{2-e^z}$$
简单推导一下:
$$\hat{R}(z)=\dfrac{1}{2}\dfrac{1}{1-\frac{1}{2}e^z}=\sum_{l\ge 0}\dfrac{e^{lz}}{2^{l+1}}$$
可以得到:
$$R_n=n![z^n]\hat{R}(z)=\dfrac{1}{2}\sum_{l\ge 0}\dfrac{l^n}{2^l}$$
#### 分割集合
定义 $S^{(r)}_n$ 表示把集合 $\{1,2,\cdots,n\}$ 分成 $r$ 个不相交集合的方案数,定义 $\mathcal{S}^{(r)}=\bigcup_n \mathcal{S}^{(r)}_n$,这个组合集对应的元素为一种分割,分割的每一部分被叫做一个块。而一个分割可以被一个有标号类的集合表示(每个代表一个块),所以有:
$$\mathcal{S}^{(r)}=\operatorname{SET}_r\{\operatorname{SET}_{\ge 1}(\mathcal{Z})\}\Rightarrow \hat{S}^{(r)}(z)=\dfrac{1}{r!}(e^z-1)^r$$
可以发现,$S^{(r)}_n=\dfrac{1}{r!}R^{(r)}_n$。从组合意义可以看出,一个 $r$ 分割恰好对应 $r!$ 个 $r$ 满射,两个满射在分割意义下是等价的,当且仅当一个是另一个的排列。
容易发现,分割数跟第二类斯特林数有很大的关系,即:
$$S_{n}^{(r)}=\begin{Bmatrix}n\\r\end{Bmatrix}$$
根据第二类斯特林数的定义可以得出。所以有:
$$R_n=\sum_{r\ge 0}r!\begin{Bmatrix}n\\r\end{Bmatrix},S_n=\sum_{r\ge 0}\begin{Bmatrix}n\\r\end{Bmatrix}$$
观察到 $S_n$ 其实就是贝尔数。
注意到 $\mathcal{S}=\operatorname{SET}\{\operatorname{SET}_{\ge 1}(\mathcal{Z})\}$,这样可以导出:
$$\hat{S}(z)=e^{e^z-1}$$
简单推导一下:
$$\hat{S}(z)=\dfrac{1}{e}e^{e^z}=\dfrac{1}{e}\sum_{l\ge 0}\dfrac{e^{lz}}{l!}$$
可以得到:
$$S_n=n![z^n]\hat{S}(z)=\dfrac{1}{e}\sum_{l\ge 0}\dfrac{l^n}{l!}$$
#### 平面图
这个 "Alignments" 我也不知道怎么翻译好,于是就直译了。一个平面图被定义为一个良标号的圆组成的序列,定义 $\mathcal{O}$ 为平面图的集合,则显然有:
$$\mathcal{O}=\operatorname{SEQ}\{\operatorname{CYC}(\mathcal{Z})\}\Rightarrow \hat{O}(z)=\dfrac{1}{1-\ln(1-z)^{-1}}$$
#### 排列
注意到一个排列其实就是若干圆排列的集合,可以从置换环的角度考虑,这样排列的集合 $\mathcal{P}$ 就有:
$$\mathcal{P}=\operatorname{SET}\{\operatorname{CYC}(\mathcal{Z})\}\cong\operatorname{SEQ}(\mathcal{Z})$$
能导出 EGF:
$$\hat{P}(z)=\exp\left(\ln\dfrac{1}{1-z}\right)=\dfrac{1}{1-z}$$
接下来就用刚刚的方法推导一些东西吧。
#### 树
树分为两种,一种是平面树,特点是子树之间有顺序,另一种是非平面树,特点是子树之间无顺序。此外,我们定义集合 $\Omega\in\mathbb{N}$ 为树的所有点的出度的集合,其中因为树有叶子,所以一定有 $0\in\Omega$。
对于平面有根树,本质上就是确定根之后,剩下的点分成若干部分变成子树,然后递归下去,所以对于平面有根树的集合 $\mathcal{A}$ 有:
$$\mathcal{A}=\mathcal{Z}\ast\operatorname{SEQ}_{\Omega}(\mathcal{A})$$
这样对应的 EGF 为:
$$\hat{A}(z)=z\sum_{w\in\Omega}\hat{A}^w(z)$$
容易发现这个和不带标号的平面有根树很像,具体来讲,不带标号的平面有根树个数为:
$$\dfrac{1}{n!}A_n$$
原因根据组合意义显然。而根据我不会的拉格朗日反演可以得到:
$$A_n=n![z^n]\hat{A}(z)=(n-1)![u^{n-1}]\left(\sum_{w\in\Omega}u^w\right)^n$$
而对于非平面有根树,思路类似,对于它的集合 $\mathcal{T}$,我们有:
$$\mathcal{T}=\mathcal{Z}\ast\operatorname{SET}_{\Omega}(\mathcal{T})$$
这样对应的 EGF 为:
$$\hat{T}(z)=z\sum_{w\in\Omega}\dfrac{\hat{T}^w(z)}{w!}$$
注意到如果 $\Omega=\mathbb{N}$,则有:
$$\hat{T}(z)=ze^{\hat{T}(z)}$$
可与通过我不会的拉格朗日反演得到:
$$T_n=n^{n-1}$$
如果我们考虑森林,其实就是把若干个树组成一个森林,且顺序无所谓,所以森林的集合 $\mathcal{F}$ 为:
$$\mathcal{F}=\operatorname{SET}\{\mathcal{T}\}$$
即 $\hat{F}(z)=\exp\hat{T}(z)$。
### 写在最后
本篇文章参考 [Analytic Combinatorics](http://algo.inria.fr/flajolet/Publications/books.html) 这本书的第一,二章,对原文内容做了很大简化,有需要的同学可以找来原书看。由于本人数学很差,所以如果有错还请请喷并指出qwq