cf1119h-solution

CF1119H Solution

link

题意:给你三个数 \(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\) 数组

\[FWT_{i,j}=(-1)^{\text{popcount}(j\&a_i)}x+(-1)^{\text{popcount}(j\&b_i)}y+(-1)^{\text{popcount}(j\&c_i)}z \]

如果用上面这个式子求出 \(n\)\(FWT\) 数组,然后点乘,再 \(IFWT\),复杂度是 \(\mathcal O(n2^k+k2^k)\) 的,仍然爆炸。

我们最后要求的是数组 \(\prod FWT_i\)\(\prod\) 为点乘),考虑下标 \(j\)

\[\prod_i FWT_{i,j}=\prod_i( (-1)^{\text{popcount}(j\&a_i)}x+(-1)^{\text{popcount}(j\&b_i)}y+(-1)^{\text{popcount}(j\&c_i)}z) \]

后面的只会有 \(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\) 值的贡献,则有

\[c_1+c_2-c_3-c_4=\sum_{i}FWT_{i,j} \]

至于如何求 \(\sum_{i}FWT_{i,j}\),我们可以直接把所有桶先加起来再 \(FWT\),因为 \(FWT\) 是线性变换。

类似地,令 \(x=0,y=0,z=1\)\(x=0,y=1,z=1\) 我们分别可以得到

\[c_1-c_2+c_3-c_4=\sum_{i}FWT_{i,j} \]

\[c_1-c_2-c_3+c_4=\sum_{i}FWT_{i,j} \]

注意这里的 \(\sum_{i}FWT_{i,j}\) 是针对不同的桶算的。

现在我们有了关于 \(c_1,c_2,c_3,c_4\) 的四个方程,解出方程直接快速幂即可。

复杂度 \(\mathcal O(n+k2^k)\)

posted @ 2024-02-27 20:20  iorit  阅读(13)  评论(0)    收藏  举报