少项式异或卷积 FWT
本篇文章含有大量不是人语言内容,请谨慎阅读。
在 这篇文章 中,我在 CF1119H 后面写了一个推广形式的做法,但由于我的脑子退化了或者我的语言理解能力/语言表达能力下降了,反正研究了一晚上也没看懂,现在重新推一遍,而且要写的详细一点,避免第二次忘掉。
问题模型:给定 \(n\) 个多项式 \(F_i(x)=\sum_{j=0}^{k-1} f_jx^{a_{i,j}}\),求所有多项式异或卷积后的结果。设 \(m\) 为值域(\(a_{i,j}\in[0,2^m)\)),一般来讲,\(n,2^m\) 都不小,\(k\) 不大。
约定:设 \(P(x)\) 为 \(\operatorname{popcount}(x)\bmod 2\),即 popcount 奇偶性。
首先,暴力做法是将 \(n\) 个多项式全部 FWT 后乘起来然后 IFWT,但 \(O(nm2^m)\) 的复杂度肯定太高了。但对少项式求这个东西太浪费了,进一步的做法是考虑 FWT 实际求的个什么玩意,观察位矩阵不难发现 \(FWT_{i,p}=\sum_{0\le j<2^m}coef_i(-1)^{P(p\&j)}\),其中 \(coef_i\) 是第 \(x^i\) 的系数。在这题中,由于是少项式,所以只有 \(k\) 个 \(coef_i\) 是有值的,所以实际上可以写成 \(FWT_{i,p}=\sum_{0\le j<k}f_j(-1)^{P(p\&a_{i,j})}\)。
现在我们要求 \(n\) 个 \(FWT_{*,p}\) 相乘的结果了。你发现这个值很难求,但是可能出现的值的种类数只有 \(2^k\) 种,即每种 \(f_j\) 带上 \(1\) 或 \(-1\) 的系数。
以下全部单独考虑所有 FWT 数组第 \(p\) 位的乘积。
设 \(c_T\) 为 FWT 后第 \(T\) 种值出现的次数,这里若 \(T\) 的第 \(j\) 位为 0 则 \(f_j\) 系数为 \(1\),否则为 \(-1\);则我们需要 \(2^k\) 个线性无关的方程才能解出所有 \(c_T\)。
考虑枚举 \(S\subseteq\{0,1,\cdots,k-1\}\),现在单独考虑第 \(i\) 个多项式,假设第 \(i\) 个多项式贡献到了 \(c_T\) 中,那么我只让 \(coef_{val_i(S)}=1\),其中 \(val_i(S)=\oplus_{j\in S}a_{i,j}\),也就是只把这一位的系数设为 1,其余设为 0,然后 FWT 它,FWT 后的结果 \(w_p\)(注意这里只考虑第 \(p\) 位)显然等于 \((-1)^{P(p\&val_i(S))}\)。而我们有 \((d_1\oplus d_2\oplus \cdots\oplus d_m)\& C=(d_1\&C)\oplus(d_2\&C)\cdots\oplus(d_m\&C)\),所以便有 \(P((d_1\oplus d_2\oplus \cdots\oplus d_m)\& C)=P(d_1\&C)\oplus P(d_2\&C)\cdots\oplus P(d_m\&C)\),整理一下就是 fwt 数组 \(w_p=(-1)^{\oplus_{j\in S}P(p\&a_{i,j})}\),这相当于,一个 \(j\) 只有在 \(S\) 内才有贡献,并且对于一个 \(j\),因为这个多项式 FWT 后最终贡献到了 \(c_T\) 上,所以只有 \(T\) 在 \(j\) 位上是 1 的时候 \((-1)^{P(p\&a_{i,j})}\) 才贡献 \(-1\),否则贡献 \(1\) 等于没贡献。所以,最终这个单独的 \(T\) 对 \(w\) 的贡献系数是 \((-1)^{P(S\&T)}\)。
众所周知 FWT 有线性性,两边都对 \(n\) 个 \(i\) 取总和,就有 \(\sum_{1\le i\le n}(-1)^{P(p\&val_i(S))}=\sum_{0\le T<2^k}(-1)^{P(S\&T)}c_T\),观察到左边等于 \([x^p]FWT(A_S)=[x^S]FWT(c)\),其中 \(A_S\) 代表对于每个 \(i\) 给 \(A_{val_i(S)}\) 加 1。那么我们预处理出所有 \(A_S\) 的 fwt,然后对于每一位确定 \(FWT(c)\) 的值,则 \(c\) 就可以由上面这个东西 IFWT 得到。得到了 \(c\) 这题就做完了,算出这一位上的乘积,然后把总的 IFWT 一遍即可。
预处理 \(A_S\) 的复杂度为 \(O(nk2^k+2^{m+k}m)\),算乘积的复杂度是 \(O(2^m\cdot2^kk)\),最终做一遍 IFWT 复杂度是 \(O(2^mm)\),所以总时间复杂度 \(O(nk2^k+2^{m+k}(m+k))\)。

浙公网安备 33010602011771号