鲜花:几种快速计算多个少项式异或卷积的算法

我也不知道我写了个啥标题,反正就很厉害就是了。

给定常数 \(a,b,c\),给定 \(n\) 个二元组 \((x_i,y_i)\),已知 \(f\) 满足 \(f_{0,0}=1\)\(f_{i,j}=af_{i-1,j}+bf_{i-1,j\oplus x_i}+cf_{i-1,j\oplus y_i}\),求 \(f_{n,*}\) 的每一项系数。
\(1\le n\le 10^7,0\le x_i,y_i\le 2^{20}\)

首先发现存在 \(O(nm)\) 做法。

将每个二元组视作一个序列 \(h\),满足 \(h_0=a,h_x=b,h_y=c\),那么每次 DP 相当于和 \(h\) 序列做 xor 卷积。每次求 \(\text{fwt}(h)\) 可以做到 \(O(nm\log m)\),比暴力劣一点。

因为 \(h\) 只有 \(O(1)\) 个位置有值,考察 \(\text{fwt}(h)\) 的形式,其只存在四种本质不同的取值:\(a+b+c,a-b+c,a+b-c,a-b-c\)。考虑每一个位置,那么设这四种值在 \(n\) 个 FWT 序列中出现次数分别为 \(p_1,p_2,p_3,p_4\),那么我们就能得知这个位置在进行 \(n\) 次卷积后的值为 \((a+b+c)^{p_1}(a+b-c)^{p_2}(a-b+c)^{p_3}(a-b-c)^{p_4}\)

现在问题转化为对于每个位置,求 \(p_1,p_2,p_3,p_4\) 的值。我们计算维护三个序列 \(f_1,f_2,f_3\),对于 \(n\) 个二元组,我们在 \(f_1\)\(x\) 位置 \(+1\),在 \(f_2\)\(y\) 位置 \(+1\),在 \(f_3\)\(x\oplus y\) 位置 \(+1\),记这三个序列 FWT 之后某个位置的值分别为 \(c_1,c_2,c_3\),那么我们就能知道这个位置的 \(p_1,p_2,p_3,p_4\) 满足:

\[p_1+p_2+p_3+p_4=n \]

\[p_1+p_2-p_3-p_4=c_1 \]

\[p_1-p_2+p_3-p_4=c_2 \]

\[p_1-p_2-p_3+p_4=c_3 \]

那么可以解出 \(p_1,p_2,p_3,p_4\) 的值,得到对应序列之后 IFWT 回去即可求出 \(f_n\)

复杂度 \(O(n+m\log m)\),实在是神仙。

给定 \(n\) 个三元组 \((a_i,b_i,x_i)\),已知 \(f\) 满足 \(f_{0,0}=1\)\(f_{i,j}=a_if_{i-1,j}+b_if_{i-1,j\oplus x_i}\),求 \(f_{n,*}\) 的每一项系数。

\(0\le n,m\le 2^{20}\)

其实也能做五元组的,但是我太懒了不想推了 /kel。

考虑延续上面的思路,我们快进到 FWT 部分。

我们要求:

\[[x^k]F(x)=[x^k]\prod(a_ix^{\empty}+b_ix^{x_i}) \]

\[=\prod[x^k]\text{fwt}(a_ix^{\empty}+b_ix^{x_i}) \]

\[=\prod(a_i+(-1)^{|k\cap x_i|}b_i) \]

\[=\exp \sum \ln(a_i+(-1)^{|k\cap x_i|}b_i) \]

\[=\exp \sum [x^k]\text{fwt}(p_1x^{\empty}+p_2x^{x_i}) \]

\[=\exp [x^k] \text{fwt}\sum (p_1x^{\empty}+p_2x^{x_i}) \]

于是我们算出来 \(p_1,p_2\) 直接做 FWT 再 EXP 即可求出答案。

复杂度 \(O(n \log m+m\log m)\)

两个题的核心思想在于化 \(\prod\)\(\sum\),然后利用 FWT 的线性性统一处理。

posted @ 2026-01-07 21:11  _Kenma  阅读(5)  评论(0)    收藏  举报