2024.12.23 闲话
(通过北京集训)学习了一下符号化容斥的思路,大致记叙一下 .
upd. 其实好像就是序列上的所谓集合划分容斥,在集合上的问题只需要把形式幂级数换成集合幂级数 .
前置知识:浅谈多项式与生成函数、符号化方法 .
记号约定:花体字母表示无标号组合类:,带帽子的花体字母表示有标号组合类:,同一个题目中相同字母表示的组合类是对应的(尽管标号结构可能不一样) .
容斥原理的基本思路大概是这样的:有一个基本单位的组合类 ,要求它在某种限制下的组合 .
考虑扩充组合类 ,使得 和 在 下所生成的组合对象的种类是一样的(尽管方案数可能并不相同). 同时通过构造 上每个元素对应的贡献(即容斥系数)来使得 ,从而去掉 的限制 .
00-avoiding 序列
计数 上的长度为 的整数序列,使得不出现两个连续的 .
如果没有不出现两个连续的 的限制,只需令一位的组合类是 ,答案即为 .
考虑加入若干组合对象 :连续 个 组成的序列 . 上述组合对象构成组合类 . 现在对于 考察 . 后令 是合法 段长的组合类 .
可以把 分成 和 两部分 . 对于一段 来说,在 中只可能由 或 得到,考虑对 上的元素构造容斥系数,使得 ,那么其实也就相当于是 .
令 对应的生成函数是 ,则需要 ,可得 .
从而可以得到 的生成函数 (左边 是 的生成函数).
那么答案就是 ,其生成函数也容易得到了: .
Yet Another Permutation Problem
对于长度为 的排列 ,执行不超过 次操作:选出其中的一个数并放到排列的开头或结尾 .
对每个 求出:操作过后可能得到的排列个数 .
数据范围: .
对于这道题,可能我们更熟知的是它同时被称为 Jiangly 的排列数数题 . 总之经过一些转换可以把问题转化为对每个 求最长连续上升段 的排列个数 .
先考虑如果没有限制怎么做,在此处使用有标号组合体系,一位的生成函数是 ,则答案为 .
然后类似地考虑扩充组合类,根据先前的经验自然发现需要把上升段扩充进去,令 表示长度为 的上升段对应的组合对象,其对应的组合类为 (由于 所以这里 也是扩充后的组合类).
令合法段的组合类为 ,这里合法段是没有容斥系数的,需要对 设计容斥系数 . 把一些连续段拼起来得到新的连续段的操作实际上对应 变换,于是可以得到 ,进而可导出普通生成函数 .
那么欲求即为 ,这里需要一个 的变换,可以手动提取一下:
这样就可以进行计算了 . 由于 只有 项,所以暴力的时间复杂度就是 ,可以通过 .
进一步的复杂度优化可以参阅开头提到的 EI 的博客 .
给定 ,问分别由 个 组成的不存在子串 的字符串数量 .
数据范围: .
假设经过上面两个题我们已经比较熟练了,重复的过程就不详细展开了 .
扩充组合类为 ,那么需要 ,这就是 .
作为普通生成函数的三个元分别计量 数量,转回原题代入容斥系数,一段的生成函数:
答案即为 .
作换元 ,则:
把后面的有理分式展开后转为提取若干个 ,这是简单的 . 从而问题被 解决 .
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18589284
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】