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\) 也一样.
集合幂级数 exp
给定集合幂级数 \(F\) ,求出 \(G=exp F\) .
从组合意义入手,\(exp\) 就相当于是将 \(S\) 中的点划分为若干个连通块的方案数,那么展开就是 \(G(S)=\prod_{\cup S_i=S \wedge \cap S_i=\emptyset}F(S_i)\) 。
考虑枚举最后一个确定的集合,将该集合和前面已经求出的答案进行合并,但发现会重复计算,例如:\(\{1,2\},\{3,4\},\{5\}\) ,这个方案就会计算 \(3!\) 次,为了避免算重,我们再转移时钦定转移到的集合的最小元一定是新加入的连通块中的元素,这样就可以避免算重。
由于我们要保证最后求出全集的,所以集合大小会从小集合转移到大集合,所以枚举当前的集合大小,通过刷表法转移,枚举集合大小 \(t\) ,那么此时集合大小小于 \(t\) 的向更大的集合的转移都已经完成,只要处理出当前大小为 \(t\) 的转移,而在转移时,钦定最小元相同的才能进行 \(FWT\) 即可。
ln
跟上面差不多,就是用所有的方案数减去连通块个数大于 \(2\) 的方案数,减数的求法和上面相同,被减数则是给定的集合幂级数。
Problem
AT_arc100_c [ARC100E] Or Plus Max
对于第 \(i\) 位,在其他位相同的情况下,第 \(i\) 位为 \(0\) 的可以贡献给第 \(i\) 位为 \(1\) 的答案,那么就是一个高维前缀和的形式,直接进行一个前缀 \(max\) 即可.
posted on 2025-09-27 23:00 Pearblossom 阅读(5) 评论(0) 收藏 举报
浙公网安备 33010602011771号