其实就是高维前缀和。FMT 和 FWT 几乎一样,一个是分治一个是 DP。
FMT:有 \(C_i=\sum\limits_{j\oplus k=i}A_jB_k\),其中 \(\oplus\) 为与、或。
构造 \(FMT[S]_i=\sum\limits_{j\oplus i=i}S_j\),有
\(
\begin{align*}
&FMT[A]_x\times FMT[B]_x \\
&=\sum\limits_{i\oplus x=x} A_i\sum\limits_{i\oplus x=x} B_j \\
&=\sum\limits_{k\oplus x=x}\sum\limits_{i|j=k}A_iB_j \\
&=\sum\limits_{k\oplus x=x}C_k \\
&=FMT[C]_x
\end{align*}
\)
于是进行一次高维前缀和,计算出 \(FWT[A]\) 与 \(FWT[B]\),每个位置相乘得到 \(FWT[C]\),然后再差分回来。
FMT 因为是 DP 形式,所以更加灵活, \(N\) 无需为 \(2\) 的次方。
FWT:有 \(C_i=\sum\limits_{j\oplus k=i}A_jB_k\)。
构造 \(FMT[S]_i=\sum\limits_{j\oplus i=i}S_j\),其中 \(\oplus\) 为与、或,有