1 条题解

  • 0
    @ 2025-10-23 20:16:38

    关键思路

    1.单堆游戏的 SG 函数

    考虑单堆硬币,从上到下编号 11mm。每次操作选择某个颜色的硬币,移除它和上面的所有硬币。 这相当于:选择位置 ii1im1 \le i \le m),若该位置硬币颜色匹配当前玩家,则移除 1i1 \dots i 的所有硬币。 这是一个取石子游戏的变种,每个位置对应一个可选移动。

    2.单堆 SG 值的计算

    对于硬币串 SS(长 mm),递归计算:

    空堆:SG = 0

    对每个位置 i=1mi = 1 \dots m

    S[i]S[i] 是蓝色,是 Natalia 的可选操作,移除后剩下 i+1mi+1 \dots m

    S[i]S[i] 是红色,是 Cezary 的可选操作,移除后剩下 i+1mi+1 \dots m

    注意这是非对称游戏(Partizan Game),公平状态要求无论谁先手,后手必胜。

    3.公平条件的转化

    定义单堆 pp

    winN(p)win_N(p) = Natalia 先手时是否能赢

    winC(p)win_C(p) = Cezary 先手时是否能赢

    递归关系:

    $win_N(S) = \bigvee_{i=1}^m [S[i] = N \land \lnot win_C(S[i+1..m])]$

    $win_C(S) = \bigvee_{i=1}^m [S[i] = C \land \lnot win_N(S[i+1..m])]$

    公平单堆:winN(p)=Falsewin_N(p) = FalsewinC(p)=Falsewin_C(p) = False

    4.多堆组合

    多堆游戏:

    winN(p1,,pd)win_N(p_1, \dots, p_d) = 存在 Natalia 在某堆的合法移动,使移动后 winC()=Falsewin_C(\dots) = False

    winC(p1,,pd)win_C(p_1, \dots, p_d) = 存在 Cezary 在某堆的合法移动,使移动后 winN()=Falsewin_N(\dots) = False

    公平状态要求:

    Natalia 先手时无必胜策略

    Cezary 先手时无必胜策略

    5.实际解法

    预处理所有 2m2^m 种硬币串的 (winN,winC)(win_N, win_C),分类:

    cntFcntF: 公平单堆数量

    cntAcntA: 仅 Natalia 先手必胜的数量

    cntBcntB: 仅 Cezary 先手必胜的数量

    cntABcntAB: 双方先手都能赢的数量

    多堆公平通常要求 AA 类堆数 = BB 类堆数(对称性)。

    6.算法框架

    动态规划:dp[a][b]dp[a][b] = 用 aaAA 类堆和 bbBB 类堆组成公平局面的方案数。 固定前 kk 堆的类型分布,DP 计算剩余堆的分配方案。

    复杂度:预处理 O(m2m)O(m \cdot 2^m),DP O(n3)O(n^3),可接受。

    • 1

    信息

    ID
    3915
    时间
    1500ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者