半在线子集卷积及逆子集卷积

半在线子集卷积及逆子集卷积

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

posted @ 2025-04-05 15:18  spdarkle  阅读(251)  评论(1)    收藏  举报