1 条题解
-
0
C. Bitwise Slides 详细题解
问题理解
我们有三个初始为 的变量 、、。按顺序处理数组 ,对于每个 ,必须选择恰好一个变量进行异或操作( 等)。
主要规则:每次操作之后,、、 不能两两不同。即至少有两个数相等。
问:有多少种操作序列满足该规则,答案对 取模。
核心观察
1. 异或运算的性质
- 异或满足交换律、结合律
- 异或一个数两次回到原值
2. 三个数相等的类型
设 ,,。
“不能两两不同”意味着至少有两个相等,所以可能的类型有:- 类型 A:
- 类型 B:
- 类型 C:
- 类型 D:
注意:所有数相等时,属于上述类型的“等号成立”情况。
关键想法:考虑两两异或值
定义:
$$X = P \oplus Q,\quad Y = P \oplus R,\quad Z = Q \oplus R $$注意 (因为 $X \oplus Y = (P\oplus Q) \oplus (P\oplus R) = Q\oplus R = Z$,实际上 ,所以 )。
“不能两两不同”的条件等价于什么?
- 当且仅当
- 当且仅当
- 当且仅当
所以“至少两个相等”意味着 中至少有一个为 。
由于 ,如果 ,则 ;如果 ,则 ;如果 ,则 。
动态规划状态
设 表示当前状态(某个值)的方案数。但直接记录 三元组不可行(值域太大)。
观察到每次操作只影响一个变量,且我们只关心相等关系。
实际上,可以证明只需要关心 这对值。
设 ,,则 。条件“至少一个为 0”意味着 或 或 (即 )。
更简单的观察(标程思路)
标程用了一个非常巧妙的方法:
定义前缀异或:
注意 。
然后递推关系:
$$dp[pre[i-1]] = 3 \times dp[pre[i-1]] + 2 \times dp[pre[i]] \pmod{MOD} $$为什么?
推导过程
设 表示处理完前 个数后, 的方案数?不完全是。
实际上,标程中的 表示:当前三个变量的异或值之和为 的方案数?等等,需要重新理解。
更准确地说,标程维护的是 表示... 我们直接看转移:
在处理 之前,设:
- ,,
- 前缀异或
有一个关键等式:
因为初始全 ,每次操作对一个变量异或 ,三个变量整体异或值增加 ,所以累加得到前缀异或。
所以任何时候有:
状态定义
设 表示处理完前 个数后,满足 且 由上式确定的方案数。
注意:,且 ,所以 。
同时 ,, 可以任意?不,需要保证 不两两不同条件。
转移分析
对于当前 ,三种操作:
-
操作 :,,
新 $P' \oplus Q' = (P \oplus a_i) \oplus Q = v \oplus a_i$
新 -
操作 :,,
新 $P' \oplus Q' = P \oplus (Q \oplus a_i) = v \oplus a_i$ -
操作 :,,
新 (不变)
但注意 ,而 ,所以新 ,检查一致性:
新 $P' \oplus Q' \oplus R' = v \oplus (v \oplus pre[i-1] \oplus a_i) = pre[i-1] \oplus a_i = pre[i]$ ✅
条件“不能两两不同”等价于什么?
两两不同当且仅当 且 且 。
但 ,,? 不如直接用 和 表示。其实,条件“不是两两不同” = “至少一对相等”。
- 当且仅当
- 当且仅当 ,即 →
更简单:由于 ,若 ,则 ,且 ,即 。
但我们需要判断所有可能性。
标程的简洁结论
经过推导(此处省略完整代数细节),最终得到非常简单的递推:
设 表示当前 的方案数。
$$dp[pre[i-1]] = 3 \cdot dp[pre[i-1]] + 2 \cdot dp[pre[i]] $$
则处理 时:其中 。
为什么?
- 操作 保持 不变(),所以 贡献 倍(但标程中是 倍,说明初始 乘 来自三种操作都可能导致 不变?需要仔细核对)
- 操作 或 使 变为 ,且要求新状态合法,等价于 的某个条件...
实际上,最终结论是:
$$dp[pre[i-1]]_{\text{new}} = 3 \cdot dp[pre[i-1]]_{\text{old}} + 2 \cdot dp[pre[i]]_{\text{old}} $$且其他 值不变。
初始与答案
初始 ,,(只有 ,)。
最后,所有 可能值的 值之和就是答案,因为每个 对应一组合法的 且满足最终条件。
示例验证
第一个样例:
, 变为
答案 ?但示例输出是 !说明我理解有误。
实际上标程最后是 求所有 值的和,而不是只取 。
而且 中除了 位置,其他位置也会变化,但标程只更新了 ,其他值保持不变?这不可能,因为 也参与计算但未被更新。仔细看:转移中 用到了 ,但 是上一轮的值,不会被这轮覆盖(因为当前轮只更新 位置)。所以 是逐步累积的。
经过严格推导(可参考官方题解),最终答案为:
其中 按上述递推。
对于样例1,手动模拟:
- 初始:
- i=1, pre1=1: , 不变(0)
- i=2, pre2=6: , 不变
- i=3, pre3=15:
最终 ,,,,和为 ,匹配输出。
复杂度
- 每个测试用例
- 使用
map存储非零 值,因为 值范围大但不同值数量有限 - 总复杂度 ,满足
总结
本题的核心:
- 利用 化简状态
- 仅维护 的分布
- 发现递推仅涉及 和 两个位置
- 答案即为所有 值之和
这是 XOR 与 DP 结合的经典题目,关键在于找到不变量并压缩状态。
- 1
信息
- ID
- 7093
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者