CF1707 F Bugaboo

  • 题意

    对于长为 n 的数组 a,定义一次变换为 ai=aia(i mod n)+1 为异或操作。

    定义一个长为 n 的数组 c 合法,当且仅当存在一个数组 a 可以通过 t 次变换变为 c

    现在给定 n,t,q,w

    数组 c 初始全为 1

    q 次操作,每次修改 c 中一个位置的值,并给出一个 mod,询问有多少种将 1 替换成 [0,2w) 中的数的方案满足 c 是合法的,对 mod 取模。

    n107,t109,w30,q2×105,11mod109+7

  • 题解

    从简单的想起,如果给定一个 c,如何判断合法。

    显然能操作一次当且仅当 c 的异或和为 0

    将操作逆过来,等价于在 c 开头插入任意一个数,并把最后一个数舍去,然后做前缀异或。

    因此考虑一个位置 i 对操作 j 次的异或和的影响,容易发现为 (nij)

    因此将数组 reverse

    有贡献当且仅当在二进制下 ji

    Lnlowbit

    n 这个位置是我们任意填的,所以当 j=L 时,j+1 一定合法。

    那么容易归纳出当 tL 行时 t>L 一定行。

    所以现在 tL

    可能还是没有什么用,我们继续手玩一下。

    t=1 平凡。

    t=2 时我们发现要满足 c1c3cn1=0

    t=3 比较奇怪。

    t=4 时我们发现其等价于满足 kcr+4k=0 (0r<4)

    因此我们合理猜测当 t=2a 时,我们就是要满足 kcr+2ak=0 (0r<2a)

    2a1 往下不断递推,不难证明。

    现在 t2a,考虑 t 的二进制分解中最大的,设为 2b

    首先我们还是要满足 kcr+2bk=0 (0r<2b)

    考虑到大于 2b 的部分,我们将数分为两组,分别为 cr+2b+1k,cr+2b+2b+1k

    dr=kcr+2b+1k,er=kcr+2b+2b+1k

    那么就是 drer=0,也就是 dr=er

    然后我们可以发现问题可以变为关于数组 et=t2b 的子问题。

    这样我们可以建立一个二叉树结构,一个点的权要么为左右儿子的异或和,要么等于左右儿子并要求左右儿子相等,树高是 O(logn)

    考虑如何计数,可以暴力设 fi,j 表示树上节点 i,点权为 j 的方案数,转移是容易的。

    这样还是不能回答询问,但我们容易观察并归纳出对于一个 ifi,j 一定是全相等或恰有一个数不为 0 ,并且值一定是 0(2w)x 的形式,因此维护哪个位置有值和 x 就可以了。

    这样询问就可以直接把从叶子到根路径上的 f 都暴力修改然后回答。

    复杂度 O(n+qlogn)

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

posted @   leukocyte  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示