P6097 【模板】子集卷积

长度为 2n2^n 的序列 a,ba,b,计算 cc,其中

ck=∑i ∣ j=ki & j=0aibjc_k=\sum_{\begin{aligned}i~\vert~j=k\\i~\&~j=0\end{aligned}}a_ib_j

第一个条件用 FWT\texttt{FWT} 解决,但是第二个条件就有点难办了。

注意到只有 ∣i∣+∣j∣=i or j\vert i\vert+\vert j\vert=i~\texttt{or} ~j 时 i & j=0i~\&~j=0。

那么可以考虑占掉 00 的位置。

令 Fi,j={aj∣j∣=i0otherwiseF_{i,j}=\left\{ \begin{aligned} & a_j&&|j|=i\\ & 0 &&\texttt{otherwise}\\ \end{aligned} \right.,Gi,jG_{i,j} 同理。

令 Hi=∑j=0iFj∗Gi−jH_i=\sum\limits_{j=0}^iF_j*G_{i-j}。

如此,F∗GF*G 所得到的 HH 中,每一个 H∣S∣,SH_{|S|,S} 都是正确的,因为 ∣S∣|S| 相当于两个数拼在一起的长度,SS 就是他们的并。

最后的答案就是 ansi=H∣i∣,ians_i=H_{|i|,i}。时间是 O(nlog⁡2n)O(n\log^2n) 的。