两个经典 FWT 问题的经典解法

存在 \(k\) 个权值 \(d_{0\sim k-1}\) 以及 \(n\) 个长为 \(2^m\) 的数组 \(a_i\),第 \(i\) 个数组的第 \(p_{i,j}\) 个元素 \(a_{i,p_{i,j}}=d_j\),其余位置为 \(0\),需要求出 \(\prod a_i\),其中乘法为异或卷积。\(k,m\) 均不大。

\(\prod a_i\) 等价于所有 \(a_i\) 做 FWT 后点乘起来最后 FWT 回去。但我们并不支持对于每一个 \(a_i\) 做 FWT,注意到当 \(k\) 不大时某个 \(a_i\) 做 FWT 后某个位置上的结果只可能有 \(2^k\) 个——对 \(d_j\) 任意定号。若对于每个位置能求出某种定号方式可以被得到多少次,那么乘起来就可以获得 \(\prod\operatorname{FWT} a_i\)。考虑求出对于 \(2^k\) 个变量的线性方程组,解出每种定号方式的出现次数。

\(U=\{0,1,2,\cdots,k-1\}\),对于任意 \(T\in 2^U\),将第 \(i\) 个数组的 \(\bigoplus\limits_{t\in T}p_{i,t}\) 这个元素带上权值做 FWT。思考做 FWT 后的结果 \(f_i\) 可以表示成何种形式:

\[f_{i,S}=(-1)^{|S\cap\bigoplus\limits_{t\in T}p_{i,t}|}=(-1)^{|\sum\limits_{t\in T} S\cap p_{i,t}|}=\prod\limits_{t\in T}(-1)^{|S\cap p_{i,t}|} \]

FWT 是线性的,于是可以将所有数组加起来做 FWT 得到做 FWT 之后的和。不妨对于每个最终异或和单独考虑,设最后该位置上 \(S\in 2^U\) 这种定号方式出现了 \(c_S\) 次(包含在 \(S\) 中的权值取正,其余取负),同时设固定 \(T\) 后做 FWT 得到的数组为 \(F\),则:

\[F_S=\sum\limits_{K\in 2^U}(-1)^{|S\cap K|}c_K \]

不妨考虑取了一个定号方式 \(K\)。对于 \(i\in T\),若 \(i\in K\) 则会对 \(S\) 这个位置产生 \(-1\) 的贡献,若 \(i\notin K\) 则不会产生贡献。于是得到了上面的式子。

显然有 \(2^k\) 个方程,实际上没有必要用高斯消元去解。注意到固定考虑的位置 \(S\) 之后,对于所有 \(T\) 统一考虑 \(F\) 就是 \(c\) 做 FWT 后的结果,于是再做一遍 FWT 回去即可。分析一下时间复杂度,对于 \(2^k\)\(T\) 都要做一遍 \(O(m2^m)\) 的 FWT,最后对于 \(2^m\) 个位置 \(S\) 还要做 \(O(k2^k)\) 的 FWT。时间复杂度 \(O(nk2^k+(m+k)2^{m+k})\)

这个东西推广到 FMT 上是自然的。


第二个问题实际上和上面大同小异,即对选数个数产生了一些限制。将集合幂级数这个一元多项式扩到二元多项式,增加 \(y\) 记录选数个数,此时 \(x\) 做异或卷积,\(y\) 做加法卷积即可。写成 \(1+yx^{p_{i,0}}+yx^{p_{i,1}}+\cdots\),然后对其做卷积。剩下的步骤和上面一样,无非是系数变得复杂了点。时间复杂度就将整数加乘法的 \(O(1)\) 复杂度变成多项式加乘法的复杂度。

这方面的例题:Sum of (XOR^K or 0)

参考资料:Coffee_zzz: CF1919H Triple 题解

posted @ 2025-10-10 20:32  BYR_KKK  阅读(21)  评论(0)    收藏  举报