FWT

简介

  • 大概是解决形如要求 \(c_i=\sum_{j\bigoplus k=i} A_jB_k\)

  • 这个符号可以是 或,与,异或

  • 整个的流程和 FFT 很像,先正变换成 \(FWT(A),FWT(B)\) ,然后将两者相乘,最后再逆变换

  • 具体的证明和定义和一些繁杂的过程这里就不说了,直接上结论

  • 因为我们是形如 FFT 的分治运算,所以也是有规律才能分治

  • 这里直接给出这个规律

原文章

所有的正变化时, \(FWT(A)=A , [n=0]\) ,默认长度为 \(2^n\)\(A_0\) 为序列 \(A\) 的左半部分 ,\(A_1\) 为右半部分,\((A,B)\) 表示将两个序列接起来

或运算

\[FWT(A)=(FWT(A_0),type*FWT(A_0)+FWT(A_1)) \]

  • 正变化的时候 \(type=1\),否则为 \(-1\)
  • 正变化 \(FWT(A)[i]=\sum_{j|i}A_j\)

与运算

\[FWT(A)=(FWT(A_0)+type*FWT(A_1),FWT(A_1)) \]

  • 正变化时 \(type=1\) ,否则为 \(-1\)

  • 正变化 \(FWT(A)[i]=\sum_{i|j}A_j\)

异或运算

\[FWT(A)=(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1)) \]

  • 正变化
  • 正变化 \(FWT(A)[i]=\sum_{j=0}^{2^n-1}(-1)^{c(i\&j)} A[j]\)
  • \(c(x)\) 表示 \(x\) 二进制下 \(1\) 的个数

\[FWT(A)=(\frac{FWT(A_0)+FWT(A_1)}{2},\frac{FWT(A_0)-FWT(A_1)}{2}) \]

  • 逆变化

LG 模板题

参考代码

posted @ 2022-06-04 11:16  Kzos_017  阅读(50)  评论(0编辑  收藏  举报