博弈论瞎学

爆了哦。

SG 函数

用在公平组合游戏里。

大概是说:每个状态都有一个 SG 函数,其值等于所有后记状态的 SG 函数的 mex。同时,若当前状态的 SG 值为正数,则当前状态为必胜态;否则(当前状态的 SG 值为 0),当前状态为必败态。

证明一下,当前状态的 SG 值为正数时,其必可以转移到一个 SG 值为 0 的状态,否则必定会转移到 SG 值为正的状态。

经典的取石子游戏(取完最后一个的人胜)就是把 SG(0) 设为 0 算。然后改成取完最后一个的人败的话,好像只需要把 SG(0) 设为 1 就行了。


SG 定理:若一个博弈可分为多个独立子博弈,则整个博弈的 SG 值等于所有子博弈的 SG 值的异或和。

证明如下:

首先,若在任何情况下,我们都可以通过一步操作使得 SG 从非 0 变成 0,则定理必定成立。接下来考虑如何证明这个事情。

设当前状态的 SG 值为 p 且其二进制最高位为第 k 位,则首先,当前状态必定至少存在一个子博弈,满足其二进制的第 k 位为 1,这个显然。接下来,由前文定义得,对于任意小于该子状态的 SG 值的 SG 值,该子状态都可以一步转移到 SG 值为该值的状态。

于是,考虑将该状态大于 k 的位保持不变,第 k 位由 011k1 位变为值为 p2k1 ,取这样的一个 SG 值,并将这个状态转移过去,总状态的 SG 值将变为 0。容易发现这样的转移必定正确。


来点题。

  • ABC297G - Constrained Nim 2

    考虑子问题的 SG 函数。首先设有一个数量为 x 的石子堆,则:

    • x<l 时,SG 值显然为 0
    • lx<2l 时,一步操作必然会转移到 x<l 的情况,故 SG 值为 1
    • 2lx<3l 时,一步操作会转移到上面的两种状态中,故 SG 值为 2

    以此类推,我们可以发现,当 x<l+r 的时候,SG 值就是 xl。接下来考虑 xl+r 的情况。

    • l+rx<2l+r 时,显然先手必败,故 SG 值为 0
    • 2l+rx<3l+r 时,转移到 x<l+r 的话先手仍然必败,故先手必定会转移到 l+rx<2l+r 的情况,SG 值为 1

    进一步地,设当前的状态 x 位于区间 [p×(l+r),(p+1)×(l+r)) 时,感性理解可以发现,先手必定不会进行一步跃出这个区间的转移。理性分析就是跃出这个区间的话,因为它不会减去超过 r 的值,所以跃出这个区间后,SG 值必定比只考虑这个区间内的情况的 SG 值要大。

    故对于数 x,其 SG 值为 x%(l+r)l。最终答案只需用 SG 定理求一下并判断即可。

考场上要学会打表观察 SG 函数的值,别再推你的策略了。

posted @   zyb_txdy  阅读(7)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示