【学习笔记】卷积

SOS dp/高维前缀和

就是说你要对于每个 \(i\) 统计出 \(i\) 的子集和,考虑类比二、三维前缀和地一维一维枚举,对于每一维从小到大枚举集合 \(k\)

那么你枚举到第 \(i\) 位的 \(k\) 满足 \(k\) 的第 \(i\) 位为 \(1\),直接把 \(k\oplus2^i\) 位置上的值加到 \(k\) 上即可。

就是说你每一次处理的是对应维的以前处理的维的总和,没有处理的维还没有被统计到,被包含的子集由于未处理部分不同被归类到的大集合不同也不会同时出现在两个要合并的子集中。

怎么去理解这个感觉解释起来很困难,我感觉在脑海中模拟一下三维的情况是不是就可能可以理解为啥这个是不重不漏的了。

然后是对应的高维差分,也就是给了个高维前缀和让你去还原。

理论上来说正常人做差分还原的时候都是从后往前还原的,原因很显然,不然会漏减一堆东西。

但是你这个高维前缀和每一维大小只有 \(2\) 啊那不就随便你什么顺序都对这一维的还原没有啥影响。

所以你实际上就是把高维前缀和的加号换成减号就是了。

或卷积

给定 \(f,g\)\(h_S=\sum_{A\cup B=S}f_A\times g_B\)

考虑先搞出 \(H_S=\sum_{A\cup B\subseteq S}f_A\times g_B\) 然后就高维差分回去得到 \(h\)

这个 \(H\) 很容易搞啊因为 \(H_S=\sum_{A\cup B\subseteq S}f_A\times g_B=\sum_{A\subseteq S,b\subseteq S}f_A\times g_B=\sum_{A\subseteq S}f_A\times\sum_{B\subseteq S}g_B\)。也就是说你直接对 \(f,g\) 做一遍高维前缀和就能搞了。

子集卷积

给定 \(f,g\)\(h_i=\sum_{x\cap y=\emptyset,x\cup y=i}f_xg_y\)

\(x\cup y=i\) 就是简单或卷积,考虑 \(x\cap y=\emptyset\) 也就是 \(|x|+|y|=|x\cup y|\),所以你额外开一维就好。

具体地就是 \(F_{i,j}=\left\{\begin{matrix}f_j&|j|=i\\0&\text{else}\end{matrix}\right.,G_{i,j}=\left\{\begin{matrix}g_j&|j|=i\\0&\text{else} \end{matrix}\right.\)

然后你对这个东西做或卷积,复杂度 \(O(n^22^n)\)

posted @ 2026-08-25 10:56  If_miao  阅读(4)  评论(0)    收藏  举报