组合符号化
组合符号化构造
将组合对象快速转化为生成函数方法
无标号组合构造
无标号组合构造食用 OGF。
我们定义一个组合类 \((A,|·|)\) ,其中 \(A\) 是对象集合,而 \(|·|\) 将每个对象变成它的大小函数。如字符串长度,图的点集大小等。如对于 \(A=\lbrace 0,1\rbrace\),则 \(|0|=|1|=1\)。
一些定义:
- 集合 \(A\) 中设 \(a_i\) 为大小为 \(i\) 的元素个数,则可以用 OGF \(A(z)=\sum_{\alpha \in A}z^{|\alpha|}=\sum_{i=0}a_iz^i\) 表示。
- \(\epsilon\) 中性对象,可以理解为空,有 \(|\epsilon|=0\)
- \(\bullet\) 原子对象,\(|\bullet|=1\),对应 OGF 中的 \(z\),可以理解为指定根等。
- 组合类 \(A,B\) 同构记作 \(A=B\)
- 笛卡尔积:\(A\times B=C\),\(C=\lbrace(a,b)|a\in A,b\in B\rbrace\),对应 OGF 运算 \(A(z)\times B(z)=C(z)\),对应组合意义是把两个集合进行两两组合。
- 集合并,要求两个集合没有交集 \(A\cup B=C\implies A(z)+B(z)=C(z)\)
笔者初学难以理解的地方:其实 \([z^n]A(z)\) 的系数是指的不同的大小为 \(n\) 的元素个数。
一些常用的Trick:
\(A(z)+1\):指定一个空组合对象,这样在计数的时候会方便一些
\(A(z)+z\):图计数的时候相当于指定一个根,也可以说是原点
\(SEQ\) 构造
生成所有组合,不考虑顺序。例如 \(\lbrace a,b,c\rbrace\) 会生成 \(\epsilon,a,b,c,ab,bc,ab,aaa,aab,aba,abc,abb,acc,baa……\)
\[\begin{aligned}
SEQ(A)(z)&=\sum_{i=1}A(z)^i\\
&=\frac{1}{1-A(z)}
\end{aligned}
\]
实现:多项式求逆即可。
\(MSET\) 构造与 \(Euler\) 变换
生成所有组合,去掉重复顺序。
例如 \(\lbrace a,b\rbrace\) 会生成 \(\epsilon,a,b,aa,ab,bb,aaa,aab,abb,bbb……\)
\[\begin{aligned}
MSET(A)&=\prod_{\alpha \in A}SEQ(z^{|\alpha|})\\
&=\prod_{\alpha \in A}\frac{1}{1-z^{|\alpha|}}\\
&=\prod_{i\ge 0}(\frac{1}{1-z^i})^{a_i}\\
&=\exp(\ln\prod_{i\ge 0}(1-z^i)^{-a_i})\\
&=\exp(\sum_{i\ge 0}a_i\ln \frac{1}{1-z^i})\\
&=\exp(\sum_{i\ge 0}a_i\left(\sum_{j\ge 0}\frac{z^{ij}}{j}\right)\\
&=\exp(\sum_{i\ge 0}\frac{a_i}{j}z^{ij})\\
&=\exp(\sum_{i\ge 0}\frac{A(z^i)}{i})\\
\end{aligned}
\]
可以 \(O(n\log n)\) 计算 \(\sum_{i\ge 0}\frac{A(z^i)}{i}\) 然后 \(\exp\) 即可。
\(PSET\) 构造
\(CYC\) 构造与 \(Burnside\) 引理
有限制的组合构造
逆变换
有标号组合构造
标号与 \(exp\) 组合意义
\(SEQ\) 构造
\(POI\) 构造
\(CYC\) 构造
\(SET\) 构造
\(Sub\) 构造
\(BOX\) 构造
参考资料:
- 从零开始的生成函数魔法
- oi-wiki

浙公网安备 33010602011771号