从Nim游戏到SG函数
Nim游戏
公平组合问题在蓝桥杯等算法竞赛中经常出现,最经典的例子莫过于Nim游戏
Nim游戏:两个玩家面前有若干堆石子,每个玩家每次可在每堆石子中取走任意多个石子,取走最后一枚石子的玩家获胜。
其结论为如果所有堆的石子个数的异或值为0,那么代表这个状态是先手必负,否则说明该状态为先手必胜状态。
SG函数
由SG定理可知,所有的公平组合问题都等价于若干单堆Nim游戏的和(要求是类似取走最后一个石子的人获胜)
例子
Bash博弈
一堆石子,每次只能取1~k个,取到最后一个石子的人获胜。
首先SG(0)=0为先手必负状态
SG(1)=1
SG(2)=2
SG(3)=3
...
SG(k)=k
SG(k+1)=0
因此Bash博弈的先手必负条件等价于n%(k+1)=0
否则先手必胜.