前言
好久没写博客了,上一篇博客还是去年实训写的,一是因为寒假,二是因为随着难度的加深,学一个算法的时间也变长了很多(蒟蒻专有buff)。当然,最重要的还是因为自己懒~
后面会继续努力的。(这csdn的markdown编辑器又改版了越来越难用了)
转载请注明转自bestsort的博客
好了,进入主题,说一下SG函数和SG定理吧
什么是组合游戏
在竞赛中,组合游戏的题目一般有以下特点
- 题目描述一般为 A A A, B B B 2人做游戏
- A A A B B B交替进行某种游戏规定的操作,每操作一次,选手可以在有限的操作(操作必须合法)集合中任选一种。
- 对于游戏的任何一种可能的局面,合法的操作集合只取决于这个局面本身,不取决于其它因素(跟选手,以前的所有操作无关)
- 如果当前选手无法进行合法的操作,则为负
举个例子现在有一个数0,小明小红2人每次可以轮流在当前数加 1~3,谁先凑到21谁就赢
这个描述就符合上面的条件:
- 小明小红(满足1)
- 每次轮流在当前数上加1~3(满足2)
- 当前能进行的操作只取决于这个数本身(也就是这个局面),如果这个数为20,可操作的集合为+{1},如果为12,可操作的集合为+{1,2,3}(满足3)
- 如果数字已经为21了,则不可能往上在加数字,可操作集合为 Φ \Phi Φ,当前选手为负(满足4)
必胜点和必败点的概念
- 必败点(P点) 前一个(previous player)选手将取胜的点称为必败点
- 必胜点(N点) 下一个(next player)选手将取胜的点称为必胜点
比如现在数字已经为18了,那么当前操作人只要给数字+3则必胜,我们就把在此位置称为必胜点(正常操作情况下,别杠说都18偏要+2。。。。)
必胜点和必败点的性质:
- 所有的终结点都是必败点
- 从任何必胜点操作,至少有一种方式进入必败点
- 无论如何操作, 从必败点都只能进入必胜点.
Sprague-Grundy(SG)定理
游戏和的SG函数
等于各个游戏SG函数的Nim和
。这样就可以将每一个子游戏分而治之,从而简化了问题。而Bouton
定理就是Sprague-Grundy
定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x) = x。
Nim和 : 各个数相异或的结果
SG函数
先定义mex(minimal excludant)
运算,这是施加于一个集合的运算,表最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于任意状态 x , 定义 SG(x) = mex(S),其中 S S