半在线子集卷积及逆子集卷积
半在线子集卷积及逆子集卷积
quack的ppt太烂了,只能靠自己写个记录了
半在线子集卷积
神似:
\[f(S)=\sum_{T\sub S}f(T)g(S/T)
\]
其中 \(g\) 已知。
注意到在子集卷积中,我们利用了 \(|S|\),而空集的贡献容易计算。
因此我们可以按顺序枚举 \(|T|,|S/T|\) 来贡献到 \(|S|\),然后再提出已经求出的 \(f(S)\) 进行计算。
这很简单,相当于普通的子集卷积改了下顺序。
for(int s=1;s<=n;++s){
for(int i=1;i<s;++i){
//计算 i,s-i,0特别处理
}
}
更多的应用场景:需要固定某个 \(x\in S/T\)。
此时我寻找到的处理办法是运用差分:设 \(x=highbit(S)\),则可以写作 \([x^S]FWT(f)-[x^{S/x}]FWT(f)=[x^{S/x}]FWT(f)*\lbrace [x^S] FWT(g)-[x^{S/x}]FWT(g)\rbrace\)
特别处理 \(|S|\le 1\) 即可
逆子集卷积
\[f(S)=\sum_{T\subseteq S} g(T)h(S/T)
\]
此时还是回到了我们作 FWT 的过程,已知 \(f,g\),求 \(h\)。
注意到:
\[[x^n]FWT_{siz}(f)=\sum_{i=0}^{siz}[x^n]FWT_{i}(g)[x^n]FWT_{siz-i}(h)
\]
因此事实上只看一个 \(x^n\),这是一个关于 \(siz\) 的 \(|U|+1\) 次多项式。
故做 \(2^{|U|}\) 次 \(O(|U|^2)\) 的多项式求逆就行了。
逆半在线子集卷积
板子题是 ABC213G
其组合意义与连通图容斥相当接近。
即我们有:
\[x=highbit(S),f(S)=\sum_{x\in T\subset S}f(T)g(S/T)
\]
利用半在线卷积的差分技巧
\([x^S]FWT(f)-[x^{S/x}]FWT(f)=[x^{S/x}]FWT(f)*\lbrace [x^S] FWT(g)-[x^{S/x}]FWT(g)\rbrace\)
我们只需要处理 \(|S|\le 1\) 的 \(FWT\) 值,就足以求出差分,进而还原整个数组。
而 \(|S|\le 1\) 是平凡的。
因此就OK了。
参考代码:code

浙公网安备 33010602011771号