鸣谢xym学长
其实前面的都是废话
精髓都在最后的SG定理中了
很难理解?
那好,我们举个栗子
Nim游戏:
其实学长的课件上有写解法,
但是我觉得写得太烂
还是自己说比较清楚
*复杂的情况我们考虑不过来,那就从简单的开始
如果只有一堆,先手必胜(都拿走就好了)
*两堆:
如果有两堆中的石子数目相同,
那么先手从任意一堆中拿走任意数目
后手只要在另一堆中模仿ta的操作,
先手必败
观察一下我们可以发现
如果石子的数目 ^ 和==0,先手必败
!=0, 先手必胜
难道这是巧合吗
当然不是!!!
实际上每堆石子的数目就是当前堆的SG值
(这个怎么理解呢:如果我们从这一堆拿走石子,
我们可以拿1,2,3,4…a[i]个,
接下来的状态就是a[i]-1,a[i]-2,a[i]-3…0,
a[i]是第一个达不到的状态,
卡SG的概念,那么a[i]就是当前堆得SG啦)
我们回顾一下定理
那我们照葫芦画瓢,异或一下,
设答案为k
如果k==0那么先手必败
(极端考虑两堆数目相同的石子)
如果k!=0先手必胜
原因:k!=0,那k二进制表示一定有一个最高位j是1
在所有石子中一定有一堆j位也是1(不然k中的1是怎么来的。。。),设为第i堆
那先手把i堆的石子拿成a[i]^k,
这样剩下的所有石子堆异或和就==0了,
这就相当于个对手留下了一个必败局面
此时先手必胜
tip
在一般的博弈中
sg函数可以暴力求得,(卡住sg的定义)
暴力枚举后继状态,求mex
整个游戏的sg就是求一下子游戏的sg异或和即可
一般规定
sg==0,先手必败
否则先手必胜