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} ~ji & j=0i~\&~j=0

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

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

Hi=j=0iFjGijH_i=\sum\limits_{j=0}^iF_j*G_{i-j}

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

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