cf1119h-solution
CF1119H Solution
题意:给你三个数 \(x,y,z\),考虑 \(n\) 个数组,每个数组有 \(x\) 个 \(a_i\),\(y\) 个 \(b_i\),\(z\) 个 \(c_i\),\(a_i,b_i,c_i\in[0,2^k)\)。
对于所有 \(t\in[0,2^k)\),求从每个数组各取出一个数,这些数 xor 和为 \(t\) 的方案数,模 \(998244353\)。
\(n\le10^5,k\le17\)。
首先显然题目要求的就是 \(n\) 个桶 xor 卷积后的结果,但是直接卷积是 \(\mathcal O(nk2^k)\) 的,肯定过不了。
注意到每个桶只有 \(3\) 个位置有值。考虑 xor 卷积的过程,求出第 \(i\) 个数组的 \(FWT\) 数组
如果用上面这个式子求出 \(n\) 个 \(FWT\) 数组,然后点乘,再 \(IFWT\),复杂度是 \(\mathcal O(n2^k+k2^k)\) 的,仍然爆炸。
我们最后要求的是数组 \(\prod FWT_i\)(\(\prod\) 为点乘),考虑下标 \(j\)
后面的只会有 \(8\) 种取值(\(3\) 个正负号)。为了方便,我们一开始将 \((a_i,b_i,c_i)\) 全部 xor 上一个 \(a_i\),
得到 \((0,b_i \oplus a_i,c_i\oplus a_i)\),最后再把答案 xor 上 \(\bigoplus_i a_i\)。这样 \(8\) 种取值变成了 \(4\) 种,因为 \(x\) 系数一定是 \(1\) 了。
四种取值分别是 \(x+y+z,x+y-z,x-y+z,x-y-z\),我们分别算出每种的数量最后快速幂就好了。
设四种情况数量分别为 \(c_1,c_2,c_3,c_4\)。首先 \(c_1+c_2+c_3+c_4=n\)。
显然 \(c_1,c_2,c_3,c_4\) 与 \(x,y,z\) 的取值无关。
考虑令 \(x=0,y=1,z=0\),那么 \(FWT_{i,j}=(-1)^{\text{popcount}(j\&b_i)}\)。
这时候考虑 \(4\) 种情况对这些 \(FWT\) 值的贡献,则有
至于如何求 \(\sum_{i}FWT_{i,j}\),我们可以直接把所有桶先加起来再 \(FWT\),因为 \(FWT\) 是线性变换。
类似地,令 \(x=0,y=0,z=1\) 和 \(x=0,y=1,z=1\) 我们分别可以得到
注意这里的 \(\sum_{i}FWT_{i,j}\) 是针对不同的桶算的。
现在我们有了关于 \(c_1,c_2,c_3,c_4\) 的四个方程,解出方程直接快速幂即可。
复杂度 \(\mathcal O(n+k2^k)\)?

浙公网安备 33010602011771号