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}\) 的变换,可以手动提取一下:
这样就可以进行计算了 . 由于 \(\hat p(x)\) 只有 \(\Theta(n/k)\) 项,所以暴力的时间复杂度就是 \(\Theta (n^2\log n)\),可以通过 .
进一步的复杂度优化可以参阅开头提到的 EI 的博客 .
给定 \(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\) 数量,转回原题代入容斥系数,一段的生成函数:
答案即为 \(\dfrac1{1-F(a,b,c)}\) .
作换元 \(u=abc,\,v=1-a-b-c\),则:
把后面的有理分式展开后转为提取若干个 \(\frac{1-u}v(1+\frac{2u}s)^k\),这是简单的 . 从而问题被 \(\Theta(a+b+c)\) 解决 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18589284
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ