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)\)

    跟官方题解有一定区别,但是本质上只是把从上往下建树变成了从下往上建树,有些地方可能不是特别自然。

posted @ 2022-07-19 14:20  leukocyte  阅读(122)  评论(0)    收藏  举报