FMT/FWT学习笔记
FMT
卷积
\(FMT\) 或卷积和与卷积是相似的,都是一个类似高维前缀和,这里只讲述或卷积.
或卷积就是要实现一个 \(C=A \times B\),这里的乘号表示卷积,使得\(C_{S}=\sum_{u \cup v=S}A_{u} \times B_{v}\) ,这里的乘号表示数值的相乘.
首先我们可以直接暴力枚举子集,复杂度是 \(O(4^n)\) 的,考虑优化.
分治
我们将当前集合中的最大元拎出来单独考虑,那么 \(C=C^{-}+x^{n}C^{+}\),\(A,B\) 同理,那么\(A\times B = (A^{-}+x^{n}A^{+})\times(B^{-}+x^{n}B^{+})=A^{-}\times B^{-}+x^{n}(A^{+}\times B^{-}+A^{-}\times B^{-}+A^{+}\times B^{+})=A^{-}\times B^{-}+x^{n}((A^{-}+A^{+})\times(B^{-}+B^{+})-A^{-}\times B^{-})\) ,那么复杂度就变成了 \(T(n)=2T(\frac{n}{2})+O(n)=O(nlogn)\),所以复杂度就变成了\(O(n2^n)\).
FMT(迭代)
考虑将上述递归过程改成迭代的形式,观察式子发现可以先让前一半的系数加到后一半上,再对应位相乘(因为到底部是就是对应位相乘),再用后半部分减去前半部分即可.
FWT
集合对称差卷积
分治
还是将 \(A\) 根据是否有最大元拆开,\(A=A^{-}+x^{n}A^{+}\) ,那么卷积就会变成\(A^{-} \times B^{-}+A^{+}\times B^{+}+x^{n}(A^{+}\times B^{-}+A^{+}\times B^{-})\),如果直接两两卷积,时间复杂度仍然是 \(O(n^4)\).令\(p=(A^{+}+A^{-})\times(B^{+}+B^{-}),q=(A^{+}-A^{-})\times(B^{+}-B^{-})\) ,那么原式就变成了 $ \frac{p+q}{2} + x^{n} \frac{p-q}{2}$,这样就只用进行两次卷积.
FWT
异或卷积就是形如 \(C=A \times B\),使得 \(C_{S}=\sum_{u \oplus v=S}A_{u}\times B_{v}\).
首先有恒等式 \(\frac{1}{2^n}\sum_{T \in 2^U}(-1)^{|S \cap T|}=[S= \emptyset]\).
同时还有式子 \(A = B \leftrightarrow A \oplus B= \emptyset\) ,\((A \oplus B)\cap C=(A\cap C)\oplus(B\cap C)\)
那么现在就可以化柿子了,\(C_{S}=\sum_{u \oplus v \oplus S = \emptyset} \sum_{T \in 2^U}(-1)^{|(u \oplus v \oplus S)\cap T|}A_{u}\times B_{v}=\sum_{T\in 2^U}(-1)^{|S \cap T|} \times \sum_{u\in 2^U}(-1)^{|u\cap T|}f_u \sum_{v\in 2^U}(-1)^{|v\cap T|}g_v\) ,那么我们就可以让 \(f^{'}{u}=(-1)^{|u|}f_u\) ,那么就有 \(h^{'}=f^{'}\times g^{'}\) ,逆变换同样可以根据上面的式子得出 \(f_S=\sum_{T\in 2^U}(-1)^{|S\cup T|}f^{'}S\) .
考虑怎么计算这个东西,枚举子集 \(O(3^n)\) ,但还不够.
由于位运算的各位独立性,我们逐位的考虑贡献,\(f=f^{-}+x{n}f^{+}\) ,发现正负由交集的大小决定,那么对于 \(f_S^{'-}\) 中对 \(f_S\) 的贡献系数为 \(1\) ,对 \(f_{S∪n}\) 的贡献系数同样为 \(1\) ,剩下的系数为 \(1,0\) ,逆变换的话还要在最后乘上 \(\frac{1}{2^n}\) .
其他的也同理.
矩阵实现的理解
记号 :\(\cdot\) 表示卷积 ,\(\times\) 表示直接的数值乘积.
我们希望实现一个这样的卷积 \(h_S=\sum_{u \oplus v=S} f_u \times g_v\) ,其中的 \(\oplus\) 为按位异或/按位与/按位或的操作,定义 \(f^{'}_S=\sum_{T\in 2^U} C(S,T)\times f_T\),希望能够实现 \(h^{'}=f^{'} \times g^{'}\) ,化柿子,\(h^{'}_S=\sum_{T\in 2^U} C(S,T)h_T =\sum_{T\in 2^U}C(S,T)\sum_{u\in 2^U}f_u \sum_{v\in 2^U}[u\oplus v=T]f_u\times g_v = \sum_{u\in 2^U} \sum_{v\in 2^U} C(S,u\oplus v) f_u\times g_v = \sum_{u\in 2^U} C(S,u)f_u \times \sum_{v\in 2^U}C(S,v)g_v \times [u\oplus v=S]\),那么就要求 \(C(S,u\oplus v)=C(S,u)\times C(S,v)\) .这是第一个限制.
于此同时,我们希望 \(C(S,T)\) 的各位之间的运算结果相互独立,即有 \(C(S,T)=\prod_{i} C(S_i,T_i)\) .
当前在考虑第 \(i\) 位,那么当 \(S\) 的第 \(i\) 位为 \(0\) 时,有转移 \(f_S=C(0,0)\times f_S^{-} + C(0,1)\times f_S^{+}\).第 \(i\) 位为 \(1\) 也一样.
Problem
AT_arc100_c [ARC100E] Or Plus Max
对于第 \(i\) 位,在其他位相同的情况下,第 \(i\) 位为 \(0\) 的可以贡献给第 \(i\) 位为 \(1\) 的答案,那么就是一个高维前缀和的形式,直接进行一个前缀 \(max\) 即可.
posted on 2025-09-27 23:00 Pearblossom 阅读(0) 评论(0) 收藏 举报