FMT 与 子集(逆)卷积
本文参考了 Dance of Faith 大佬的博客
我们定义集合并卷积
最暴力的时候只能 完成,进行 一些优化 可以在 内完成,当然我们可以在 利用 或者 内快速处理。
原理更好理解,就介绍此种方式。
具体来说,类似与 我们把 求点值,然后点值相乘后再插值变化回去。因为要快速实现这个过程,我们可以考虑利用 快速莫比乌斯变换 和 快速莫比乌斯反演 实现。
定义
定义 的莫比乌斯变换 ,满足 。(也就是 是原来函数 的子集和)
定义 的莫比乌斯反演 ,利用容斥原理可以得到 。
考虑为什么这个形式满足集合并卷积。
左右同时做莫比乌斯变换。
由于 ,也就有
证毕。
快速变换与反演
原理讲解
上面那两个集合和我们暴力做是 的,可以进行优化。
考虑按 集合大小 分层递推。
令 为 ,有 。
那么对于不包含 的集合 ,满足 ,那么它的贡献就是
这样,递推 轮后 就包含所有情况,即为所求变换。
对于莫比乌斯反演的话,同样递推,不断减掉就行了。
代码实现
子集卷积
原理讲解
我们定义 与 的子集卷积 。
其实就是
刚刚讲的子集并卷积为何不行呢?因为有 的这个限制。
如何去掉这个限制呢,我们多记一维集合大小,也就是 表示有 个元素,集合表示为 。
显然当且仅当 时是正确的,我们先做 。
所以递推的时候就是 ,其实是个多项式乘法。
由于前面对于 个函数进行 需要 的复杂度。
这里 也优化不了复杂度(而且由于常数会慢很多),那么直接暴力卷积就好了。
代码实现
最后我们要求 的子集卷积的结果,直接用 的。
子集逆卷积
原理讲解
我们有时候需要做子集卷积意义下的除法或者相关运算。
比如对于两个函数 ,我们已知 要求 。
那么就是 。其实就是要求 在子集卷积意义下的结果。
同样我们只需要考虑 之后的结果。
由于对于每一位我们做的是多项式下的乘法。其实就是对于每一位求的 就是多项式求逆后的结果。
同样对于别的运算也是多项式后的结果。
但是写那个 的倍增多项式求逆显然十分地麻烦,可以考虑 递推。
令 假设我们求出 ,要求 。 。
我们可以把 减去 和 前 项做卷积后的第 项的值,就是所求的 。
这样就可以解决啦qwq
代码
__EOF__

本文链接:https://www.cnblogs.com/zjp-shadow/p/10263392.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效