CF1707 F Bugaboo
-
题意
对于长为 的数组 ,定义一次变换为 , 为异或操作。
定义一个长为 的数组 合法,当且仅当存在一个数组 可以通过 次变换变为 。
现在给定 。
数组 初始全为 。
次操作,每次修改 中一个位置的值,并给出一个 ,询问有多少种将 替换成 中的数的方案满足 是合法的,对 取模。
。
-
题解
从简单的想起,如果给定一个 ,如何判断合法。
显然能操作一次当且仅当 的异或和为 。
将操作逆过来,等价于在 开头插入任意一个数,并把最后一个数舍去,然后做前缀异或。
因此考虑一个位置 对操作 次的异或和的影响,容易发现为 。
因此将数组 。
有贡献当且仅当在二进制下 。
令 为 的 。
而 这个位置是我们任意填的,所以当 时, 一定合法。
那么容易归纳出当 行时 一定行。
所以现在 。
可能还是没有什么用,我们继续手玩一下。
平凡。
时我们发现要满足 。
比较奇怪。
时我们发现其等价于满足 。
因此我们合理猜测当 时,我们就是要满足 。
从 往下不断递推,不难证明。
现在 ,考虑 的二进制分解中最大的,设为 。
首先我们还是要满足 。
考虑到大于 的部分,我们将数分为两组,分别为 。
令 。
那么就是 ,也就是 。
然后我们可以发现问题可以变为关于数组 和 的子问题。
这样我们可以建立一个二叉树结构,一个点的权要么为左右儿子的异或和,要么等于左右儿子并要求左右儿子相等,树高是 。
考虑如何计数,可以暴力设 表示树上节点 ,点权为 的方案数,转移是容易的。
这样还是不能回答询问,但我们容易观察并归纳出对于一个 , 一定是全相等或恰有一个数不为 ,并且值一定是 或 的形式,因此维护哪个位置有值和 就可以了。
这样询问就可以直接把从叶子到根路径上的 都暴力修改然后回答。
复杂度 。
跟官方题解有一定区别,但是本质上只是把从上往下建树变成了从下往上建树,有些地方可能不是特别自然。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)