1 条题解

  • 0
    @ 2025-11-12 21:02:58

    题目大意

    给定一个长度为 NN 的数组,每个位置可能是白色或黑色。两人轮流操作:

    • 每次选择一个白色格子,设下标为 xx
    • 再选择一个整数 kk,满足 1kN/x1 \leq k \leq \lfloor N/x \rfloor
    • x,2x,,kxx, 2x, \dots, kx 这些格子颜色翻转(白变黑,黑变白)。

    无法操作者输。
    先手会给出多个初始状态(只给出白色格子位置),问每个状态下先手是否有必胜策略。


    题型分析

    这是一个组合游戏问题,具有以下特点:

    1. 多个子游戏:每个白色格子可以看作一个独立的子游戏,因为对 xx 操作时,只会影响 xx 的倍数位置,且这些倍数的下标都大于等于 xx,不会影响更小的下标。
    2. 公平组合游戏:双方操作规则相同,且操作集合只依赖于当前状态。
    3. 可用 SG 定理:整个游戏的 SG 值是每个白色格子对应 SG 值的异或和。

    关键思路

    1. SG 函数定义
      SG(x)\text{SG}(x) 表示只在位置 xx 为白色、其它位置为黑色时,该局面的 SG 值。

    2. 操作的影响
      xx 操作时,选择 kk,会翻转 x,2x,,kxx, 2x, \dots, kx 的颜色。
      在只考虑 xx 的倍数时,这相当于在 xx 的倍数序列上翻转一个前缀的长度为 kk 的区间。

    3. 子游戏独立性
      因为 xx 的倍数序列中,每个位置 txtx 的 SG 值是 SG(t)\text{SG}(t)(由于局面等价于从 tt 开始的子游戏)。
      所以对 xx 操作,等于在 xx 的倍数序列上选择 kk,翻转 SG(1),SG(2),,SG(k)\text{SG}(1), \text{SG}(2), \dots, \text{SG}(k) 对应的局面。

    4. 转化为 Nimber 计算
      于是 SG(x)\text{SG}(x) 的计算方法:
      m=N/xm = \lfloor N/x \rfloor,即 xx 的倍数个数。
      一次操作选择 1km1 \le k \le m,会将 kk 个独立的子游戏(即 SG(x),SG(2x),,SG(kx)\text{SG}(x), \text{SG}(2x), \dots, \text{SG}(kx) 对应的局面)同时翻转。
      在 SG 理论中,翻转一个子游戏等于将其 SG 值异或 1(因为只有两种状态),但这里翻转的是多个独立游戏,所以这个操作相当于将当前局面 (SG(1),SG(2),,SG(m))(\text{SG}(1), \text{SG}(2), \dots, \text{SG}(m)) 中的前 kk 个位置的状态全部取反(即白变黑、黑变白),在 SG 函数视角下,就是前 kk 个位置的 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) $

      实际上更简单的理解:定义 f(x)f(x) 为只有 xx 是白色时的 SG 值,那么对 xx 操作选择 kk,会得到新状态:f(x),f(2x),,f(kx)f(x), f(2x), \dots, f(kx) 这些位置的状态全部翻转(即从白变黑或黑变白),所以新局面的 SG 值是原来这些位置的 SG 值异或和再异或 1(如果原来白色对应 1,黑色对应 0)—— 但更标准的做法是:把每个位置的白/黑看作该子游戏是否存在,翻转等于移除或添加,这其实是公平游戏,SG 值计算需考虑操作后所有受影响的位置的 SG 异或和。

    5. 实际计算
      经过推导(详见原题AC代码),可以发现:

      • 对于 xxSG(x)\text{SG}(x) 只依赖于 N/x\lfloor N/x \rfloor
      • SG(x)\text{SG}(x) 的值很小,通常不超过 2。
      • 可以用整除分块来快速计算所有不同的 N/x\lfloor N/x \rfloor 对应的 SG 值。

    算法步骤

    1. 预处理所有不同的 N/x\lfloor N/x \rfloor 对应的 SG 值。
    2. 对每个询问,将给出的白色格子的 SG 值异或起来。
    3. 若异或和不为 0,则先手必胜(Yes),否则 No

    复杂度

    • 预处理 SG 值的复杂度为 O(N3/4)O(N^{3/4})O(N2/3)O(N^{2/3})(取决于实现)。
    • 每个询问只需异或 WW 个 SG 值,W100W \le 100

    总结

    本题是组合游戏中的经典问题,核心在于识别出每个白色格子是独立的子游戏,并且通过倍数关系将 SG 函数的计算转化为对 N/x\lfloor N/x \rfloor 的递推。利用整除分块可以高效处理 NN 很大的情况。

    • 1

    信息

    ID
    5305
    时间
    4000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者