SG定理
2015-09-13 18:52
239 查看
初始问题
给定N堆石子,每堆有Ai个石子。两个人轮流操作,每轮可以选一堆石子来取石子,可以取完,但不能不取。无法操作者输。问先手是否必胜。SG定理
相信很多人都已经知道了这个定理。假设现在有一个有向无环的游戏图G(V,E),若(i,j)∈E则表示状态i可以转移到状态j.
我们还要定义必胜态与必败态的概念。
必胜态表示,从当前状态可以转移到一个必败态。
必败态表示,从当前状态无法转移到一个必败态。
我们规定整个图不存在平局态。
设SGX
SGX=MEX({SGY,Y|(X,Y)∈E})
MEX是一个作用于集合的函数。MEX(S)的值为最小的自然数b,满足b∉S.
最终若SGX为0,则X为一个必败态。否则X为必胜态。
证明
我们归纳的来证明这个定理。假设对于之前的状态这是成立的。
现在新增了一个状态X.
若SGX>0,则必然存在一个Y:(X,Y)∈E 满足SGY=0.因为SGY=0,所以Y为一个必败态。因此X为一个必胜态。
若SGX=0,则∀y:(X,Y)∈E,SGY>0.也就是说他只能转移到必胜态。因此X为一个必败态。
最终由于没有出边的状态Q为必败态,SGQ=0.所以归纳成立。
回归原问题
好像有了上面的定理我们就能做了???其实是不能的。因为原问题中我们的一个状态X=(A1,A2,⋯,AN).状态数实在是太多了。根本不可能存的下来。
但是假如只有一堆石子的话,
SG(A1)=MEX({SG(j),j<A1})
最终化简得SG(A1)=A1.
然而并没有什么卵用
原问题是多个堆。但是两两之间没有什么影响啊??能不能缩?Another theorem
设一个游戏间的运算+,X+Y表示将X与Y复合。即这两个游戏相互不影响,但在同一个游戏X+Y中。设游戏X=X1+X2+⋯+XN
记⊕表示xor.
则SGX=SGX1⊕SGX2⊕⋯SGXN.
Why?
Proof
首先考虑游戏X具有的转移。设X=X1+X2+⋯+XN.
因为一次只能选择一个单独的游戏进行,所以X具有的转移其实是
X1+X2+⋯+X′i+⋯+XN,1≤i≤N.
其中X′i为Xi的一个转移。
设FX为X的转移集合。
设b=SGX1⊕SGX2⊕⋯SGXN.
那么为了证明SGX=b,我们事实上只需要证明两条性质。
∀a∈N,a<b,∃x′∈FxSGX′=a.
∀x′∈FxSGX′≠b
证明第一条性质
我们同样需要采用归纳法来证明。∀a∈N,a<b,∃x′∈FxSGX′=a.
记d=b ⊕ a,d的最高位为k.则必存在SGXi的第k位为1.
因为SGXi ⊕ d<SGXi,所以必然存在X′∈FXi,SGX′=SGXi ⊕ d.
因为d=b ⊕ a⇒a=b ⊕ d.即
a=SGX1⊕SGX2⊕⋯SGXi⊕d⊕⋯SGXN
又因为存在X′∈FXi,SGX′=SGXi⊕d,
a=SGX1⊕SGX2⊕⋯SGX′⊕⋯SGXN
因为X′∈FXi,所以X1+X2+⋯+X′+⋯+XN∈FX.
所以
∀a∈N,a<b,∃x′∈FxSGX′=a.
证明第二条性质
我们现在用反证法。假设∃x′∈FxSGX′=b
那么SGX′=SGX1⊕SGX2⊕⋯SGXN
设X′=X1+X2+⋯+X′i+⋯+XN
X=X1+X2+⋯+Xi+⋯+XN
那么SGX′=SGX1⊕SGX2⊕⋯⊕SGX′i⊕⋯⊕SGXN
那么就有SGXi=SGX′i
因为SGXi=MEX(SGX′i)
SGXi≠SGX′i
矛盾
所以不存在SGX′=b
得证。
相关文章推荐
- Linux快速教程和图说设计模式(互联网博集)
- ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist
- POJ C++程序设计 编程题#4:计算整数平方和
- IOS每天15个注意点系列之UI-帧动画与图片浏览
- javascript中window对象 部分操作
- 阿里巴巴实习生
- IO流
- tomcat 7源代码调试环境搭建(二)
- Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
- leetcode Bitwise AND of Numbers Range
- JavaScript权威设计--JavaScript对象(简要学习笔记七)
- HDU 5442 Favorite Donut 后缀数组
- Myql where子句IN的使用方法
- 邮件解码---GMIME的使用其实很简单
- ResponseCode 404
- keystone-all 代码分析
- 包装类和Map接口的使用
- 编写一个业务函数,实现按行读取文件。把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。
- C#读取Word模板替换相应的字符串(标签)生成新的Word
- Android中Intent概述及使用