组合结构符号化

参考自 x义x 的同名博客。

一、无标号计数

  • 定义 1.1(组合类):组合类是一个集合 \(\mathcal A\) 和一个附带的大小函数 \(f:\mathcal A\to\mathbb N\)(记 \(f(a)\)\(|a|\)\(|a|_{\mathcal A}\))。

    它需要满足对于任意 \(n\in\mathbb N\)\(\mathcal A_n:=\{a\in\mathcal A:|a|=n\}\) 都是有限集(从而 \(\mathcal A\) 是至多可数集)。

    组合类中的元素被称作组合对象。

    定义 \(\mathcal A\) 的计数序列为 \((A_n)_{n=0}^{\infty}\) 满足 \(A_n:=\operatorname{card}\mathcal A_n\)

  • 定义 1.2(计数序列的 OGF):设组合类 \(\mathcal A\) 的计数序列为 \((A_n)_{n=0}^{\infty}\)。定义 \((A_n)_{n=0}^{\infty}\) 的 OGF 为形式幂级数:

    \[A(z):=\sum_{n\in\mathbb N}A_nz^n \]

    容易看出,上述定义和下面是等价的:

    \[A(z):=\sum_{a\in\mathcal A}z^{|a|} \]

  • 定义 1.3(笛卡尔积):设 \(\mathcal B,\mathcal C\) 是组合类。定义它们的笛卡尔积 \(\mathcal B\times\mathcal C\) 的大小函数满足对于任意 \((b,c)\in \mathcal B\times\mathcal C\)\(|(b,c)|_{\mathcal B\times\mathcal C}:=|b|_{\mathcal B}+|c|_{\mathcal C}\)

  • 引理 1.4:设 \(\mathcal B,\mathcal C\) 是组合类,\(\mathcal A=\mathcal B\times\mathcal C\)。那么 \(A(z)=B(z)C(z)\)

笛卡尔积的组合意义是:将两个组合类中的组合对象有序地拼在一起。

  • 定义 1.5(不交并):设 \(\mathcal B,\mathcal C\) 是组合类且 \(\mathcal B\cap \mathcal C=\varnothing\)。定义它们的无交并 \(\mathcal B\cup \mathcal C\) 的大小函数满足对于任意 \(a\in\mathcal B\cup \mathcal C\)\(|a|_{\mathcal B\cup \mathcal C}:=\begin{cases}|a|_{\mathcal{B}}&a\in \mathcal B\\|a|_{\mathcal C}&a\in\mathcal C\end{cases}\)
  • 定义 1.6(和):设 \(\mathcal B,\mathcal C\) 是组合类。定义它们的和为 \(\mathcal B+\mathcal C:=(\mathcal E_1\times\mathcal B)\cup(\mathcal E_2\times\mathcal C)\),其中 \(\mathcal E_1,\mathcal E_2\) 是两个不同的、仅包含一个大小为 \(0\) 的组合对象的组合类。
  • 引理 1.7:设 \(\mathcal B,\mathcal C\) 是组合类且 \(\mathcal B\cap\mathcal C=\varnothing\)\(\mathcal A=\mathcal B\cup \mathcal C\)。那么 \(A(z)=B(z)+C(z)\)
  • 引理 1.8:设 \(\mathcal B,\mathcal C\) 是组合类,\(\mathcal A=\mathcal B+ \mathcal C\)。那么 \(A(z)=B(z)+C(z)\)

和的组合意义是:区分所属组合类地将两个组合类合并。

  • 定义 1.9(有序列表构造):设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)。定义它的有序列表构造为 \(\operatorname{SEQ}(\mathcal B):=\bigcup_{l\in\mathbb N}\mathcal B^l\)
  • 引理 1.10:设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)\(\mathcal A=\operatorname{SEQ}(\mathcal B)\)。那么 \(A(z)=\frac{1}{1-B(z)}\)

有序列表构造的组合意义是:用同一组合类内的若干组合对象有序地拼在一起。

  • 定义 1.11(映射群):映射群是由映射构成的集合、且在复合运算下构成群。

  • 定义 1.12(等价类):设 \(\mathcal B\) 是组合类,\((G_n)_{n=0}^{\infty}\) 是映射群列,满足 \(G_n\) 中的元素是定义域和对应域都是 \(\{b\in \mathcal B:|b|=n\}\) 的映射。

    \(b_1,b_2\in\mathcal B\) 本质相同(记为 \(b_1\equiv b_2\)),当且仅当 \(|b_1|=|b_2|\) 且存在 \(g\in G_{|b_1|}\) 使得 \(g(b_1)=b_2\)

    容易证明本质相同关系是自反、对称、传递的。

    定义组合类 \(\mathcal B/G:=\{\{b_2\in\mathcal B:b_1\equiv b_2\}:b_1\in\mathcal B\}\),即所有等价类构成的集合。

    对于 \(S\in \mathcal B/G\) 定义 \(|S|_{\mathcal B/G}\)\(S\) 中任一组合对象的大小,注意与 \(|S|\) 区分。

  • 定义 1.13(环构造):设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)。定义它的环构造为 \(\operatorname{CYC}(\mathcal B)=(\operatorname{SEQ}(\mathcal B)\setminus \{()\})/G\)。其中 \(G_n\) 是所有 \(n\) 元组上的循环位移构成的群。

  • 引理 1.14:设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)\(\mathcal A=\operatorname{CYC}(\mathcal B)\)。那么:

    \[A(z)=\sum_{k\geq 1}\frac{\varphi(k)}{k}\ln\frac{1}{1-B(z^k)} \]

    其中 \(\varphi\) 是数论上的欧拉函数。

    证明:考虑使用 Burnside 引理。先枚举序列长度 \(n\),再枚举循环位移的步数 \(d\),可得:

    \[A(z)=\sum_{n\geq 1}\frac{1}{n}\sum_{d=1}^nB(z^{n/\gcd(d,n)})^{\gcd(d,n)} \]

    其中 \(B(z^s)\) 相当于把同一个组合对象复制为 \(s\) 份。转为枚举 \(k=n/\gcd(d,n)\)\(g=\gcd(d,n)\)

    \[\begin{aligned} A(z)&=\sum_{k\geq 1}\sum_{g\geq 1}B(z^k)^{g}\frac{1}{kg}\sum_{d=1}^{kg}[\gcd(d,kg)=g]\\ &=\sum_{k\geq 1}\frac{\varphi(k)}{k}\sum_{g\geq 1}\frac{B(z^k)^g}{g}\\ &=\sum_{k\geq 1}\frac{\varphi(k)}{k}\left.\left(\int\frac{1}{1-x}\right)\right|_{x=B(z^k)}\\ &=\sum_{k\geq 1}\frac{\varphi(k)}{k}\left.\left(\ln\frac{1}{1-x}\right)\right|_{x=B(z^k)} \end{aligned} \]

环构造的组合意义是:用同一组合类内的若干组合对象拼成一个环。

  • 定义 1.15(可重集构造):设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)。定义它的可重集构造为 \(\operatorname{MSET}(\mathcal B)=\operatorname{SEQ}(\mathcal B)/G\),其中 \(G_n\) 是所有 \(n\) 元置换。

  • 引理 1.16:设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)\(\mathcal A=\operatorname{MSET}(\mathcal B)\)。那么:

    \[A(z)=\prod_{i\geq 1}\left(\frac{1}{1-x^i}\right)^{B_i} \]

    证明:相当于将 \(\mathcal B\) 中的每个组合对象先做一次 \(\operatorname{SEQ}\),再笛卡尔积组合起来。

  • 引理 1.17:设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)\(\mathcal A=\operatorname{MSET}(\mathcal B)\)。那么:

    \[A(z)=\exp\left(\sum_{i\geq 1}\frac{B(z^i)}{i}\right) \]

    证明:代数上,可以将引理 16 中的式子先取 \(\ln\) 再取 \(\exp\) 得到。

    组合意义上,仍然考虑 Burnside 引理。先枚举序列长度 \(n\),再枚举置换 \(g\),设 \(g\) 环分解得到 \((a_i)_{i=1}^m\),那么:

    \[A(z)=\sum_{n\geq 1}\frac{1}{n!}\sum_g\prod_{i=1}^mB(z^{a_i}) \]

    其实就是很经典的用环刻画排列,这里略去具体过程,最后即可得到原式。

可重集构造的组合意义是:用同一组合类内的若干组合对象拼在一起,只关注每种组合对象的出现次数(无序)。

  • 例 1.18:设 \(\mathcal T\) 是所有无标号有根树构成的组合类,那么应当有:

    \[\mathcal T=\mathcal Z\times \operatorname{MSET}(\mathcal T) \]

    其中 \(\mathcal Z\) 是仅包含一个大小为 \(1\) 的组合对象的组合类。它在这里的意义是树的根。

  • 定义 1.19(染色):设有限集 \(\mathcal M=\{1,\cdots,m\}\) 和作用在 \(\mathcal M\) 上的置换群 \(G\)。设 \(\mathcal B\) 是组合类。\(\mathcal M\to \mathcal B\) 的映射被称为染色。

    称两个染色 \(\phi_1,\phi_2\in\mathcal B^{\mathcal M}\) 本质相同,当且仅当存在 \(g\in G\) 使得 \(\phi_1\circ g=\phi_2\)。类似定义等价类集合 \(\mathcal B^{\mathcal M}/G\)

    \(\mathcal B\) 还附带一个权重函数 \(w\)。那么定义一个染色 \(\phi\in\mathcal B^{\mathcal M}\) 的权重为 \(w(\phi)=\prod_{n\in\mathcal M}w(\phi(n))\)

    显然同一个等价类中的染色的权重都是相同的,将其定义为该等价类的权重。

  • 引理 1.20(Polya 定理):设有限集 \(\mathcal M=\{1,\cdots,m\}\) 和作用在 \(\mathcal M\) 上的置换群 \(G\)。设 \(\mathcal B\) 是组合类,附带权重函数 \(w\)。那么:

    \[\sum_{\phi\in \mathcal B^{\mathcal M}/G}w(\phi)=Z\left(G;\sum_{b\in \mathcal B}w(b),\cdots,\sum_{b\in\mathcal B}w^m(b)\right)\\ Z(G;x_1,\cdots,x_m)=\frac{1}{|G|}\sum_{g\in G}x_1^{j_1(g)}\cdots x_m^{j_m(g)} \]

    其中 \(j_i(g)\) 表示 \(g\) 的环分解中中大小为 \(i\) 的环的个数。

    证明:咕。

  • 例 1.21:取 \(w(b):=1\),得到:

    \[|\mathcal{B}^{\mathcal M}/G|=\frac{1}{|G|}\sum_{g\in G}|\mathcal B|^{c(g)} \]

    其中 \(c(g)=\sum j(g)\) 表示环分解中环的个数。

    其含义是计算本质不同染色方案的数量。

  • 例 1.22:取 \(w(b):=z^{|b|}\),得到:

    \[\sum_{\phi\in\mathcal B^{\mathcal M}/G}w(\phi)=Z(G;B(z),\cdots,B(z^m)) \]

    其含义是计算每种本质的染色方案的颜色大小之和的生成函数。

  • 例 1.23:取 \(G_m\) 为所有 \(m\) 元置换,得到:

    \[\sum_{m\geq 0}\sum_{\phi\in\mathcal B^{\{1,\cdots,m\}}/G_m}w(\phi)=\exp \left(\sum_{i\geq 1}\frac{1}{i}\sum_{b\in\mathcal B}w^i(b)\right) \]

    其含义是在 \(\mathcal B\) 中无序地选若干个可以重复的物品,这些物品的大小和的生成函数。

二、有标号计数

  • 定义 2.1(有标号的组合对象):称一个组合对象(这里为了直观默认为图)是弱标号的,当且仅当它的每一个节点都附带一个互不相同的正整数标号。

    你可以理解为,这个组合对象附带了一个函数 \(f\),其中 \(f_i\) 表示第 \(i\) 个节点的标号(注意这里我们并没有具体定义第 \(i\) 个节点是什么,但目的只是将所有节点区分开来)。

    称一个大小为 \(n\) 的组合对象是(强)标号的,当且仅当它是弱标号的,且所有节点的标号恰好构成 \(1,\cdots,n\) 的一个排列。

首先要注意的是,将一个大小为 \(n\) 的无标号的组合对象附上标号,所得到的有标号的组合对象的数量并不一定是 \(n!\)。比如对一棵 “两点一边” 的无标号树标号后只能形成一种有标号树。

  • 定义 2.2(离散化):定义弱标号组合对象 \(a\) 的离散化为强标号组合对象 \(\rho(a)\),使得所有节点的标号大小关系仍然不变。

  • 定义 2.3(计数序列的 EGF):设组合类 \(\mathcal A\) 的计数序列为 \((A_n)_{n=0}^{\infty}\)。定义 \((A_n)_{n=0}^{\infty}\) 的 EGF 为形式幂级数:

    \[A(z):=\sum_{n\in\mathbb N}A_n\frac{z^n}{n!} \]

    容易看出,上述定义和下面是等价的:

    \[A(z):=\sum_{a\in\mathcal A}\frac{z^{|a|}}{|a|!} \]

本章我们仅讨论由有标号的组合对象形成的组合类,所讨论的生成函数均为 EGF。

  • 定义 2.4(标号积):设 \(\mathcal B,\mathcal C\) 是组合类,\(b\in\mathcal B,c\in\mathcal C\)

    定义 \(b,c\) 的标号积为组合类 \(b\star c:=\{(b',c'):(b',c')\text{是强标号的},\rho(b')=b,\rho(c')=c\}\),其大小函数定义为 \(|(b',c')|:=|b|+|c|\)

    定义 \(\mathcal B,\mathcal C\) 的标号积为组合类 \(\mathcal B\star \mathcal C:=\bigcup_{b\in\mathcal B,c\in\mathcal C}b\star c\)

  • 引理 2.5:设 \(\mathcal B,\mathcal C\) 是组合类,\(\mathcal A=\mathcal B\star\mathcal C\)。那么 \(A(z)=B(z)C(z)\)

标号积的组合意义是:将两个组合类中的组合对象有序地拼在一起,并重新分配标号、使得维持在原组合类中的标号大小关系。

  • 定义 2.6(有序列表构造):设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)。定义它的有序列表构造为 \(\operatorname{SEQ_{\star}}(\mathcal B):=\bigcup_{l\in\mathbb N}\mathcal B^l\)。这里 \(\mathcal B\) 的幂以 \(\star\) 为基础定义。
  • 引理 2.7:设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)\(\mathcal A=\operatorname{SEQ_\star}(\mathcal B)\)。那么 \(A(z)=\frac{1}{1-B(z)}\)

有序列表构造的组合意义是:用同一组合类内的若干组合对象有序地拼在一起,并重新分配标号、使得维持在原组合类中的标号大小关系。

  • 定义 2.8(集合构造):设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)。定义它的集合构造为 \(\operatorname{SET}(\mathcal B)=\operatorname{SEQ_\star}(\mathcal B)/G\),其中 \(G_n\) 是所有 \(n\) 元置换。

  • 引理 2.9:设 \(\mathcal B\) 是组合类且 \([z^0]B(z)=0\)\(\mathcal A=\operatorname{SET}(\mathcal B)\)。那么 \(A(z)=\exp B(z)\)

    证明:枚举 \(b\in \mathcal B\) 出现了 \(i\) 次,但由于这 \(i\)\(b\) 应当是不加区分的,而给它们标号时会重复计算 \(i!\) 次,所以要除掉:

    \[\begin{aligned} A(z)&=\prod_{b\in\mathcal B}\sum_{i\geq 0}\frac{\left(\frac{z^{|b|}}{|b|!}\right)^i}{i!}\\ &=\prod_{b\in\mathcal B}\exp\left(\frac{z^{|b|}}{|b|!}\right)\\ &=\exp \left(\sum_{b\in\mathcal B}\frac{z^{|b|}}{|b|!}\right)\\ &=\exp B(z) \end{aligned} \]

    或者另一种组合意义的解释:考虑一个带标号的 \(n\) 元组,由于已经带上标号了,所以它们之间是两两相互区分的,那么这种重标号的 “set” 肯定会被恰好计算 \(n!\) 次,所以应当有:

    \[A(z)=\sum_{n\geq 0}\frac{B(z)^n}{n!}=\exp B(z) \]

集合构造的组合意义是:用同一组合类内的若干组合对象拼在一起,并重新分配标号、使得维持在原组合类中的标号大小关系,同种重标号的 “set” 仅会被算一次。

  • 定义 2.10(选根):设 \(\mathcal B\) 是组合类。定义它的选根为 \(\operatorname{PT}(\mathcal B):=\bigcup_{n\geq 0}\mathcal B_n\times \mathbb Z_{1..n}\)。其中 \(\mathbb Z_{1..n}\) 的大小函数满足 \(|i|_{\mathbb Z_{1..n}}=0\)

  • 引理 2.11:设 \(\mathcal B\) 是组合类,\(\mathcal A=\operatorname{PT}(\mathcal B)\)。那么 \(A(z)=B'(z)z\)

    证明\(A(z)=\sum_{i\geq 1}i B_iz^i=B'(z)z\)

选根的组合意义是:在组合对象中选择一个特殊节点。

  • 定义 2.12(复合):设 \(\mathcal B,\mathcal C\) 是组合类。定义它们的复合为 \(\mathcal B\circ \mathcal C=\sum_{n\geq 0}0(\mathcal B_k)\times \operatorname{SET}_k(\mathcal C)\)。其中 \(0(\mathcal B_k)\) 为将 \(\mathcal B_k\) 的大小函数设置为恒等于 \(0\) 后的结果。

  • 引理 2.13:设 \(\mathcal B,\mathcal C\) 是组合类,\(\mathcal A=\mathcal B\circ \mathcal C\)。那么 \(A(z)=(B\circ C)(z)\)

    证明\((B\circ C)(z)=\sum_{n\geq 0}B_n\frac{C(z)^n}{n!}\),其中 \(\frac{C(z)^n}{n!}\) 的组合意义是选出一个包含恰好 \(n\)\(\mathcal C\) 中组合对象并重标号的 “set”,然后由于 “set” 中的元素是两两区分的,那么直接把它们当成标号即可。

复合一般要求 \(\mathcal B\) 中的组合对象的标号不能有大小关系的限制,否则其组合意义不好解释。它的结构一般有明显的分层。可以通过下面这几个例子来理解:

  • 例 2.14:记 \(\mathcal C\) 为所有有标号序列形成的组合类,那么 \(C(z)=\sum_{n\geq 0}\frac{n!}{n!}z^n=\frac{1}{1-z}\)

    于是 \(\mathcal A=\operatorname{SEQ_\star}(\mathcal B)=\mathcal C\circ \mathcal B\),且 \(A(z)=\frac{1}{1-B(z)}=C(B(z))\)

  • 例 2.15:记 \(\mathcal C\) 为所有有标号环形成的组合类,那么 \(C(z)=\sum_{n\geq 1}\frac{(n-1)!}{n!}z^n=\sum_{n\geq 1}\frac{z^n}{n}\)

    于是 \(\mathcal A=\operatorname{CYC_\star}(\mathcal B)=\mathcal C\circ \mathcal B\),且 \(A(z)=\sum_{n\geq 1}\frac{B(z)^n}{n}\)

  • 例 2.16:记 \(\mathcal C\) 为所有有标号无序集合形成的组合类(注意,由于是无序集合,所以这里的标号仅是为了区分它们,所以仅有一种标号方式),那么 \(C(z)=\sum_{n\geq 1}\frac{1}{n!}z^n=e^z\)

    于是 \(\mathcal A=\operatorname{SET}(\mathcal B)=\mathcal C\circ \mathcal B\),且 \(A(z)=\exp B(z)\)

三、集合幂级数

咕。

例题

【ZJOI2018】树

题意:

随机生成 \(k\) 棵大小为 \(n\) 的有标号有根树,其中标号要求父亲比儿子小,求这 \(k\) 棵树同构的概率。

\(n\leq 2000\)\(k\leq 10^9\)

题解:

一开始的想法是用有标号计数来做,但其实你发现由于它是要对每个无标号有根树 \(b\) 求标号方案 \(w(b)\)\(k\) 次方之和,所以还不太一样,这里我们按照题意考虑构造一种生成函数。

注意 \(w(b)\) 并不是拓扑序的数量,因为点本来是不区分的,比如 “一个根两个儿子” 这棵三个点树只有一种标号方案而非两种。

首先考虑对两棵无标号有根树 \(b_1,b_2\) 分配标号方案,方案数为 \(w(b_1,b_2)=\binom{|b_1|+|b_2|}{|b_1|}w(b_1)w(b_2)\),那么 \(\left(\frac{w(b_1,b_2)}{(|b_1|+|b_2|)!}\right)^k=\left(\frac{w(b_1)}{|b_1|!}\right)^k\left(\frac{w(b_2)}{|b_2|!}\right)^k\),于是考虑构造生成函数:

\[B(z)=\sum_{b\in\mathcal B}\left(\frac{w(b)}{|b|!}\right)^kz^{|b|} \]

\(f(b)=\left(\frac{w(b)}{|b|!}\right)^k\),它就是一个组合对象的 “权”。那么 \(B(z)=\sum_{b\in\mathcal B}f(b)z^{|b|}\)

现在考虑分析一棵树的构造。

定义 \(\mathcal A=\operatorname{SUBT}(\mathcal B)\) 为将 \(\mathcal B\) 中的若干棵无根树拼成另一个点的所有子树。这其实和有标号中的集合构造很像,但有个 \(k\) 次幂:

\[A(z)=\prod_{b\in\mathcal B}\sum_{i\geq 0}\frac{\left(f(b)z^{|b|}\right)^i}{i!^k} \]

定义 \(\operatorname{RT}(\mathcal A)\) 为将 \(\mathcal A\) 中拼出来的若干棵子树加上根。显然 \(\mathcal B\) 就是 \(\operatorname{RT}(\mathcal A)\)。那么应当有:

\[B(z)=\sum_{n\geq 0}\frac{n!^k}{(n+1)!^k}A_nz^{n+1} \]

我们需要对 \(A(z)\) 做进一步的化简,使得它与 \(B(z)\) 关联上:

\[\begin{aligned} A(z)&=\prod_{b\in\mathcal B}\sum_{i\geq 0}\frac{\left(f(b)z^{|b|}\right)^i}{i!^k}\\ &=\exp\sum_{b\in\mathcal B}\ln\sum_{i\geq 0}\frac{\left(f(b)z^{|b|}\right)^i}{i!^k} \end{aligned} \]

\(\ln\sum_{i\geq 0}\frac{x^i}{i!^k}=\sum_{j\geq 1}g_jx^j\),那么:

\[\begin{aligned} A(z)&=\exp\sum_{b\in\mathcal B}\sum_{j\geq 0}g_j\left(f(b)z^{|b|}\right)^j\\ &=\exp\sum_{j\geq 0}g_j\sum_{b\in\mathcal B}\left(f(b)z^{|b|}\right)^j \end{aligned} \]

这一步看起来就推不下去了。

但实际上,发现如果我们要推导 \(\sum_{b\in\mathcal B}\left(f(b)z^{|b|}\right)^j\) 的话,其实和刚刚 \(B(z)\) 的推导是类似的,因为 \(f(b)\) 本来就是 \(\frac{w(b)}{|b|!}\) 的幂的形式。结合另一个可以预见到的原因(在这串式子下面有讲),正解是将 \(k\) 也当成了变量放到了角标下,然后:

\[\begin{aligned} A_k(z)&=\exp\sum_{j\geq 1}g_{k,j}\sum_{b\in\mathcal B}\left(f_k(b)z^{|b|}\right)^j\\ &=\exp\sum_{j\geq 1}g_{k,j}\sum_{b\in\mathcal B}\left(\frac{w^k(b)}{|b|!^k}z^{|b|}\right)^j\\ &=\exp\sum_{j\geq 1}g_{k,j}\sum_{b\in\mathcal B}\frac{w^{jk}(b)}{|b|!^{jk}}z^{j|b|}\\ &=\exp\sum_{j\geq 1}g_{k,j}B_{jk}(z^j) \end{aligned} \]

显然 \(B_{jk}(z)\) 只需要 \(\frac{n}{j}\) 项,而且 \(A_{jk}(z)\) 递归下去的 \(B_{j'jk}(z)\) 也仍然只需要 \(\frac{n}{j'j}\) 项。所以需要计算的 \(j\) 是有限的。具体来说:

  • \([z^m]B_{jk}(z)\) 依赖于 \([z^{m-1}]A_{jk}(z)\),对所有 \(m\) 总计算耗时 \(O(\frac {n}{j})\)
  • \([z^m]\sum_{j'\geq 1}g_{jk,j'}B_{j'jk}(z^{j'})\) 依赖于所有 \(j'|m\)\([z^{m/j'}]B_{j'jk}(z)\),对所有 \(m\) 总计算耗时 \(O(\frac{n}{j}\log\frac{n}{j})\)
  • 计算 \(A_{jk}(z)=\exp \sum_{j'\geq 1}g_{jk,j'}B_{j'jk}(z^{j'})\) 使用暴力递推式 exp,总计算耗时 \(O((\frac{n}{j})^2)\)

总时间复杂度 \(O(\sum_{j=1}^n(\frac{n}{j})^2)=O(n^2)\)

【ABC230H】Bullion

题意:

\(n\) 种物品,第 \(i\) 种重量为 \(w_i\)

一个非空的袋子,可以装若干个物品(每种物品可以装任意多个)和若干个非空的袋子,但不能啥也不装。其重量为装的东西的总重加一。

\(i=1,\cdots,W\) 求非空袋子总重为 \(i\) 的方案数。

\(n,W\leq 2\times 10^5\)

题解:

组合类分析后,容易得到下式:

\[B(z)=z\left(\exp\left(\sum_{i\geq 1}\frac{B(z^i)}{i}\right)\prod_{i=1}^n\frac{1}{1-z^{w_i}}-1\right)\\ \]

我们要求 \(B(z)\) 的前 \(n\) 项系数。

我们先解决另一个问题:已知 \(C_n=\sum_{i=0}^n A_iB_{n-i}\),而 \(C_n\) 可以推出 \(A_{n+1},B_{n+1}\),求 \(C_{0,\cdots,n-1}\)

该问题被称为全在线卷积,处理方法是倍增。假设我们已经知道了 \(A,B,C\)\(n\) 项系数,现在想求它们前 \(2n\) 项系数。我们先直接卷积得到 \(A_{0,\cdots,n-1}\times B_{0,\cdots,n-1}\)\(C_{n,\cdots,2n-1}\) 的贡献,然后剩下要算的只有 \(A_{0,\cdots,n-1}\times B_{n,\cdots 2n-1}\)\(B_{0,n-1}\times A_{n,2n-1}\) 的贡献。于是转化为两个半在线的问题,可以用分治 NTT \(O(n\log^2n)\) 解决。总时间复杂度 \(O(n\log ^2n+\frac{n}{2}\log^2\frac{n}{2}+\cdots)=O(n\log^2n)\)

然后上面那个问题也是类似处理。

posted @ 2023-01-29 12:29  ez_lcw  阅读(223)  评论(0编辑  收藏  举报