参考自《算法竞赛进阶指南》
\(NIM\)博弈:
\(n\)堆物品,第\(i\)堆物品有\(A_i\)个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品的人获胜。假设两人每一步都必然采取最优的策略。问先手是否必胜。
定理:
若先手必赢,那么当且仅当满足:\(A_1 \,\, xor \,\, A_2 \,\, xor \,\, A_3 \,\, ... \,\, xor \,\, A_n != 0\)
两个概念:
必败局面:若某一局面无论采取什么行动,都会输掉游戏,则称该局面必败。
必胜局面:若在某一局面下采取某种行动后可以使对手面对必败局面,那么优先采取此行动,那么这种局面叫必胜局面。
证明:
- 如果所有物品被取光,那么即\(A_i = 0\),那么这是一个必败局面,则满足:\(A_1 \,\, xor \,\, A_2 \,\, xor \,\, A_3 \,\, ... \,\, xor \,\, A_n == 0\)
- 对于任意一个\(A_1 \,\, xor \,\, A_2 \,\, xor \,\, A_3 \,\, ... \,\, xor \,\, A_n = x != 0\)局面,那么我们应该证明它一定可以采取一定行动来出现\(x = 0\)的局面。
- 设\(x\)的二进制表示下最高位的\(1\)在第\(k\)位,那么至少存在一堆石子\(A_i\),它的第\(k\)位是\(1\),显然\(A_i \,\, xor \,\, x \,\, < \,\, A_i\),然后我们便可以从\(A_i\)中取走\(A_i - A_i \,\, xor \,\, x\)个石子,使这堆石子变为\(A_i \,\, xor \,\, x\)个石子,那么代入式子得:\(x \,\, xor \,\, x = 0\)
- 对于任意一个\(A_1 \,\, xor \,\, A_2 \,\, xor \,\, A_3 \,\, ... \,\, xor \,\, A_n = x == 0\)局面,那么我们应该证明无论采取什么行动都不可能出现出现\(x = 0\)的局面。
- 用反证法证明:假设\(A_i\)被取成了\(A_i‘\),那么此时就应该满足\(A_1 \,\, xor \,\, A_2 \,\, xor \,\, A_3 \,\, ... \,\, xor \,\, A_i‘, \,\, ... \,\, xor \,\, A_n != 0\),由于\(A_1 \,\, xor \,\, A_2 \,\, xor \,\, A_3 \,\, ... \,\, xor \,\, A_n == A_i\), 那么则出现了\(A_i \,\, xor \,\, A_i‘ == 0\)得情况,说明\(A_i == A_i‘\),那么这显然不对与题目要求“不能不取石子”矛盾。
Mex运算
设\(S\)表示一个非负整数集合。定义\(mex(S)\)为求出不属于集合S得最小非负整数的运算,即:
SG函数
有向图中,对于每个节点\(x\),设从\(x\)出发共有\(k\)条有向边,分别到达节点\(y_1, y_2, ..., y_k\),定义\(SG(x)\)为\(x\)的后继节点\(y_1, y_2, ..., y_k\)的\(SG\)函数值构成的集合,再执行\(mex\)运算,即:
整个有向图的\(SG\)函数就是图的起点的\(SG\),\(SG(G) = SG(s)\)
那么多个有向图的游戏中,行动规则是任选一个有向图\(G_i\),并在\(G_i\)中行动一步,那么类比于\(NIM\)游戏,如果满足:
那么此时是必胜局面,证明方法与\(NIM\)博弈类似
否则必败局面。
理解:
在一个没有出边的节点上,不能进行任何操作,那么它的\(SG = 0\),此时就是必败局面。
对于一个节点的某一个后继节点\(SG = 0\)的情况,在\(mex\)运算后,该节点\(SG > 0\),那么等价于当前局面是必胜局面,因为后继界面是必败界面。
对于一个节点的后继节点\(SG\)均不为\(0\),在\(mex\)运算后,该节点\(SG\)值为\(0\),那么当前就是一个必败界面。
理论部分结束!
后边新学知识我再补上。