1 条题解
-
0
题目大意
给定一个长度为 的数组,每个位置可能是白色或黑色。两人轮流操作:
- 每次选择一个白色格子,设下标为 。
- 再选择一个整数 ,满足 。
- 将 这些格子颜色翻转(白变黑,黑变白)。
无法操作者输。
先手会给出多个初始状态(只给出白色格子位置),问每个状态下先手是否有必胜策略。
题型分析
这是一个组合游戏问题,具有以下特点:
- 多个子游戏:每个白色格子可以看作一个独立的子游戏,因为对 操作时,只会影响 的倍数位置,且这些倍数的下标都大于等于 ,不会影响更小的下标。
- 公平组合游戏:双方操作规则相同,且操作集合只依赖于当前状态。
- 可用 SG 定理:整个游戏的 SG 值是每个白色格子对应 SG 值的异或和。
关键思路
-
SG 函数定义
设 表示只在位置 为白色、其它位置为黑色时,该局面的 SG 值。 -
操作的影响
对 操作时,选择 ,会翻转 的颜色。
在只考虑 的倍数时,这相当于在 的倍数序列上翻转一个前缀的长度为 的区间。 -
子游戏独立性
因为 的倍数序列中,每个位置 的 SG 值是 (由于局面等价于从 开始的子游戏)。
所以对 操作,等于在 的倍数序列上选择 ,翻转 对应的局面。 -
转化为 Nimber 计算
于是 的计算方法:
令 ,即 的倍数个数。
一次操作选择 ,会将 个独立的子游戏(即 对应的局面)同时翻转。
在 SG 理论中,翻转一个子游戏等于将其 SG 值异或 1(因为只有两种状态),但这里翻转的是多个独立游戏,所以这个操作相当于将当前局面 中的前 个位置的状态全部取反(即白变黑、黑变白),在 SG 函数视角下,就是前 个位置的 SG 值异或 1。
更准确地说,这个游戏是翻转游戏(Turnover game)的一种,其 SG 值可以通过递推得到:$ \text{SG}(x) = \text{mex}_{1 \le k \le m} \left( \bigoplus_{j=1}^k (\text{SG}(jx) \oplus 1?) \right) $
实际上更简单的理解:定义 为只有 是白色时的 SG 值,那么对 操作选择 ,会得到新状态: 这些位置的状态全部翻转(即从白变黑或黑变白),所以新局面的 SG 值是原来这些位置的 SG 值异或和再异或 1(如果原来白色对应 1,黑色对应 0)—— 但更标准的做法是:把每个位置的白/黑看作该子游戏是否存在,翻转等于移除或添加,这其实是公平游戏,SG 值计算需考虑操作后所有受影响的位置的 SG 异或和。
-
实际计算
经过推导(详见原题AC代码),可以发现:- 对于 , 只依赖于 。
- 且 的值很小,通常不超过 2。
- 可以用整除分块来快速计算所有不同的 对应的 SG 值。
算法步骤
- 预处理所有不同的 对应的 SG 值。
- 对每个询问,将给出的白色格子的 SG 值异或起来。
- 若异或和不为 0,则先手必胜(
Yes),否则No。
复杂度
- 预处理 SG 值的复杂度为 或 (取决于实现)。
- 每个询问只需异或 个 SG 值,。
总结
本题是组合游戏中的经典问题,核心在于识别出每个白色格子是独立的子游戏,并且通过倍数关系将 SG 函数的计算转化为对 的递推。利用整除分块可以高效处理 很大的情况。
- 1
信息
- ID
- 5305
- 时间
- 4000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者