2024.12.23 闲话

(通过北京集训)学习了一下符号化容斥的思路,大致记叙一下 .

前置知识:浅谈多项式与生成函数符号化方法 .

记号约定:花体字母表示无标号组合类:\(\mathcal F,\mathcal G\),带帽子的花体字母表示有标号组合类:\(\mathcal{\hat F},\mathcal{\hat G}\),同一个题目中相同字母表示的组合类是对应的(尽管标号方式可能不一样) .

容斥原理的基本思路大概是这样的:有一个基本单位的组合类 \(\mathcal F\),要求它在某种限制下的组合 \(\operatorname{COMB}_{\sf R}(\mathcal G)\) .

考虑扩充组合类 \(\mathcal F^{\bullet}=\mathcal F+\mathcal I\),使得 \(\mathcal F^{\bullet}\)\(\mathcal F\)\(\text{COMB}\) 下所生成的组合对象的种类是一样的(尽管方案数可能并不相同). 同时通过构造 \(\mathcal F^{\bullet}\) 上每个元素对应的贡献(即容斥系数)来使得 \(\operatorname{COMB}_{\sf R}(\mathcal F)=\operatorname{COMB}(\mathcal F^{\bullet})\),从而去掉 \(\sf R\) 的限制 .

00-avoiding 序列

计数 \([0,m]\) 上的长度为 \(n\) 的整数序列,使得不出现两个连续的 \(0\) .

如果没有不出现两个连续的 \(0\) 的限制,只需令一位的组合类是 \(\mathcal D\),答案即为 \(\operatorname{SEQ}(\mathcal D)\) .

考虑加入若干组合对象 \(P_k\):连续 \(k\)\(0\) 组成的序列 . 上述组合对象构成组合类 \(\mathcal P\) . 现在对于 \(\mathcal D^{\bullet}=\mathcal D+\mathcal P\) 考察 \(\operatorname{SEQ}(\mathcal D^{\bullet})\) . 后令 \(\mathcal L\) 是合法 \(0\) 段长的组合类 .

可以把 \(\mathcal D^{\bullet}\) 分成 \(\mathcal D-\{P_1\}\)\(\mathcal P\) 两部分 . 对于一段 \(P_k\) 来说,在 \(\operatorname{SEQ}(\mathcal D^{\bullet})\) 中只可能由 \(\operatorname{SEQ}_{=k}(\mathcal P)\)\(\mathcal D^k\) 得到,考虑对 \(\mathcal P\) 上的元素构造容斥系数,使得 \(\operatorname{SEQ}_{=k}(\mathcal P)=\mathcal L_{=k}\),那么其实也就相当于是 \(\operatorname{SEQ}(\mathcal P)=\mathcal L\) .

\(\mathcal P\) 对应的生成函数是 \(p(x)\),则需要 \(\dfrac1{1-p(x)}=1+x\),可得 \(p(x)=\dfrac x{1+x}\) .

从而可以得到 \(\mathcal D^{\bullet}\) 的生成函数 \(F(x)=m\cdot x+\dfrac{x}{1+x}\)(左边 \(m\cdot x\)\(\mathcal D-\{P_1\}\) 的生成函数).

那么答案就是 \(\operatorname{SEQ}(\mathcal D^{\bullet})\),其生成函数也容易得到了:\(\dfrac1{1-F(x)}=\dfrac{1+x}{1-mx+mx^2}\) .

Yet Another Permutation Problem

对于长度为 \(n\) 的排列 \(\pi=\langle1,2,\cdots,n\rangle\),执行不超过 \(k\) 次操作:选出其中的一个数并放到排列的开头或结尾 .

对每个 \(k\) 求出:操作过后可能得到的排列个数 .

数据范围:\(n\le 1000\) .

对于这道题,可能我们更熟知的是它同时被称为 Jiangly 的排列数数题 . 总之经过一些转换可以把问题转化为对每个 \(k\) 求最长连续上升段 \(<k\) 的排列个数 .

先考虑如果没有限制怎么做,在此处使用有标号组合体系,一位的生成函数是 \(\mathcal{\hat D}\),则答案为 \(\operatorname{SEQ}(\mathcal{\hat D})\) .

然后类似地考虑扩充组合类,根据先前的经验自然发现需要把上升段扩充进去,令 \(P_k\) 表示长度为 \(k\) 的上升段对应的组合对象,其对应的组合类为 \(\mathcal{\hat P}\)(由于 \(\mathcal{\hat D}\subseteq\mathcal{\hat P}\) 所以这里 \(\mathcal{\hat P}\) 也是扩充后的组合类).

令合法段的组合类为 \(\mathcal I\),这里合法段是没有容斥系数的,需要对 \(\mathcal P\) 设计容斥系数 . 把一些连续段拼起来得到新的连续段的操作实际上对应无标号 \(\text{SEQ}\) 变换,于是可以得到 \(\operatorname{SEQ}(\mathcal P)=\mathcal I+\mathcal E\),进而可以导出普通生成函数 \(p(x)=\dfrac{x-x^k}{1-x^k}\) .

那么欲求即为 \(\operatorname{SEQ}(\mathcal{\hat P})\),这里需要一个 \(\text{OGF}\to\text{EGF}\) 的变换,可以手动提取一下:

\[p(x)=\sum_{j\ge0}\left(x^{jk+1}+x^{(j+1)k}\right)\qquad\hat p(x)=\sum_{j\ge0}\left(\dfrac{x^{jk+1}}{(jk+1)!}+\dfrac{x^{(j+1)k}}{((j+1)k)!}\right) \]

这样就可以进行计算了 . 由于 \(\hat p(x)\) 只有 \(\Theta(n/k)\) 项,所以暴力的时间复杂度就是 \(\Theta (n^2\log n)\),可以通过 .

进一步的复杂度优化可以参阅开头提到的 EI 的博客 .

Yet Another ABC String

给定 \(a,b,c\),问分别由 \(a,b,c\)\(\texttt A\;\texttt B\;\texttt C\) 组成的不存在子串 \(\texttt{ABC}\;\,\texttt{BCA}\;\,\texttt{CAB}\) 的字符串数量 .

数据范围:\(a,b,c\le 10^6\) .

假设经过上面两个题我们已经比较熟练了,重复的过程就不详细展开了 .

扩充组合类为 \(\mathcal P\),那么需要 \(\operatorname{SEQ}(\mathcal P)=1+x+x^2\),这就是 \(p(x)=\dfrac{x+x^2}{1+x+x^2}\) .

\(a,b,c\) 作为普通生成函数的三个元分别计量 \(\texttt A\;\texttt B\;\texttt C\) 数量,转回原题代入容斥系数,一段的生成函数:

\[F(a,b,c)=a+b+c-\dfrac{abc}{1-abc}(3-a-b-c) \]

答案即为 \(\dfrac1{1-F(a,b,c)}\) .

作换元 \(u=abc,\,v=1-a-b-c\),则:

\[\dfrac1{1-F}=\dfrac1{v+\frac u{1-u}(2+v)}=\dfrac{1-u}{v+2u}=\dfrac{1-u}v\cdot\dfrac1{1+\frac{2u}s} \]

把后面的有理分式展开后转为提取若干个 \(\frac{1-u}v(1+\frac{2u}s)^k\),这是简单的 . 从而问题被 \(\Theta(a+b+c)\) 解决 .

posted @ 2024-12-23 10:29  Jijidawang  阅读(99)  评论(4编辑  收藏  举报
😅​