P7526 Virtual Self

发布时间 2023-06-26 08:23:31作者: PYD1

把每个 \(v_i\) 当成 \(v_i\)\(x_i\),对这 \(n=\sum v_i\) 所有多项式分别做 FWT,我们的答案相当于是从中选 \(m\) 个乘起来,对所有这样的情况加和,再 IFWT。

考虑到这样的多项式做 FWT 之后每项都是 \(\pm1\)。我们考虑某一项所有的多项式里一共有 \(t\)\(-1\)\(n-t\)\(+1\)。那么答案多项式的这一项就是

\[\begin{aligned} \\ [x^m] (1+x)^{n-t}(1-x)^t&=\sum_{i=0}^m(-1)^i\binom{t}{i}\binom{n-t}{m-i}\\ &=t!(n-t)!\sum\dfrac{(-1)^i}{i!(m-i)!}\dfrac{1}{(t-i)!(n-m-t+i)!} \end{aligned} \]

后面那个是 \(a_i=\dfrac{(-1)^i}{i!(m-i)!},b_i=\dfrac{1}{i!(n-m-i)!}\) 的卷积,可以 NTT 计算。

剩下的问题就是怎么算某个位置有几个 \(-1\)。回到 FWT 式子上 \(FWT(a)[i]=\sum_j (-1)^{|i\and j|}a_{j}\)。那么 \(FWT(v_x)[i]=(-1)^{|x\and i|}\),第 \(i\) 位上的值就是 \(\sum(-1)^{|x\and i|}v_x\),这个可以用 FWT 计算。

复杂度 \(O(n\log n+w2^w)\),98pts,不能通过最后一个点。好像要用多项式快速插值/多点求值,不会。就这吧。