CF1707 F Bugaboo
-
题意
对于长为 \(n\) 的数组 \(a\),定义一次变换为 \(a'_i=a_i\oplus a_{(i\ \bmod\ n)+1}\),\(\oplus\) 为异或操作。
定义一个长为 \(n\) 的数组 \(c\) 合法,当且仅当存在一个数组 \(a\) 可以通过 \(t\) 次变换变为 \(c\)。
现在给定 \(n,t,q,w\)。
数组 \(c\) 初始全为 \(-1\) 。
\(q\) 次操作,每次修改 \(c\) 中一个位置的值,并给出一个 \(mod\),询问有多少种将 \(-1\) 替换成 \([0,2^w)\) 中的数的方案满足 \(c\) 是合法的,对 \(mod\) 取模。
\(n\le 10^7,t\le 10^9,w\le 30,q\le 2\times 10^5,11\le mod\le 10^9+7\)。
-
题解
从简单的想起,如果给定一个 \(c\),如何判断合法。
显然能操作一次当且仅当 \(c\) 的异或和为 \(0\)。
将操作逆过来,等价于在 \(c\) 开头插入任意一个数,并把最后一个数舍去,然后做前缀异或。
因此考虑一个位置 \(i\) 对操作 \(j\) 次的异或和的影响,容易发现为 \(\binom{n-i}{j}\)。
因此将数组 \(\text{reverse}\) 。
有贡献当且仅当在二进制下 \(j\sube i\)。
令 \(L\) 为 \(n\) 的 \(\text{lowbit}\)。
而 \(n\) 这个位置是我们任意填的,所以当 \(j=L\) 时,\(j+1\) 一定合法。
那么容易归纳出当 \(t\le L\) 行时 \(t> L\) 一定行。
所以现在 \(t\le L\)。
可能还是没有什么用,我们继续手玩一下。
\(t=1\) 平凡。
\(t=2\) 时我们发现要满足 \(c_1\oplus c_3\dots\oplus c_{n-1}=0\)。
\(t=3\) 比较奇怪。
\(t=4\) 时我们发现其等价于满足 \(\bigoplus_k c_{r+4k}=0\ (0\le r<4)\)。
因此我们合理猜测当 \(t=2^a\) 时,我们就是要满足 \(\bigoplus_k c_{r+2^ak}=0\ (0\le r<2^a)\)。
从 \(2^a-1\) 往下不断递推,不难证明。
现在 \(t\neq 2^a\),考虑 \(t\) 的二进制分解中最大的,设为 \(2^b\) 。
首先我们还是要满足 \(\bigoplus_k c_{r+2^bk}=0\ (0\le r<2^b)\)。
考虑到大于 \(2^b\) 的部分,我们将数分为两组,分别为 \(c_{r+2^{b+1}k},c_{r+2^b+2^{b+1}k}\)。
令 \(d_r=\bigoplus_k c_{r+2^{b+1}k},e_r=\bigoplus_k c_{r+2^b+2^{b+1}k}\)。
那么就是 \(d_r\oplus e_r=0\),也就是 \(d_r=e_r\)。
然后我们可以发现问题可以变为关于数组 \(e\) 和 \(t'=t-2^b\) 的子问题。
这样我们可以建立一个二叉树结构,一个点的权要么为左右儿子的异或和,要么等于左右儿子并要求左右儿子相等,树高是 \(O(\log n)\) 。
考虑如何计数,可以暴力设 \(f_{i,j}\) 表示树上节点 \(i\),点权为 \(j\) 的方案数,转移是容易的。
这样还是不能回答询问,但我们容易观察并归纳出对于一个 \(i\),\(f_{i,j}\) 一定是全相等或恰有一个数不为 \(0\) ,并且值一定是 \(0\) 或 \((2^w)^x\) 的形式,因此维护哪个位置有值和 \(x\) 就可以了。
这样询问就可以直接把从叶子到根路径上的 \(f\) 都暴力修改然后回答。
复杂度 \(O(n+q\log n)\)。
跟官方题解有一定区别,但是本质上只是把从上往下建树变成了从下往上建树,有些地方可能不是特别自然。

浙公网安备 33010602011771号