给定 N 堆石子,每堆有 Ai 个石子。两个人轮流操作,每轮可以选一堆石子来取石子,可以取完,但不能不取。无法操作者输。问先手是否必胜。
相信很多人都已经知道了这个定理。
假设现在有一个有向无环的游戏图 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 .
原问题是多个堆。但是两两之间没有什么影响啊??能不能缩?
设一个游戏间的运算 + , X+Y 表示将 X 与 Y 复合。即这两个游戏相互不影响,但在同一个游戏 X+Y 中。
设游戏 X=X1+X2+⋯+XN
记 ⊕ 表示 xor .
则 SGX=SGX1⊕SGX2⊕⋯SGXN .
Why?
首先考虑游戏 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 .即
又因为存在 X′∈FXi,SGX′=SGXi⊕d ,
因为 X′∈FXi ,所以 X1+X2+⋯+X′+⋯+XN∈FX .
所以
∀a∈N,a<b,∃x′∈FxSGX′=a .
我们现在用反证法。
假设 ∃x′∈FxSGX′=b
那么
设 X′=X1+X2+⋯+X′i+⋯+XN
X=X1+X2+⋯+Xi+⋯+XN
那么
那么就有 SGXi=SGX′i
因为
矛盾
所以不存在 SGX′=b
得证。