古代的Nim\operatorname{Nim}Nim取石子游戏是由两个人面对若干堆石子进行的游戏。
设有n≥2n\ge 2n≥2堆石子,各堆分别含有A1、A2⋯AnA_1、A_2\cdots A_nA1、A2⋯An个石子。
游戏的目的就是选取最后剩下的石子。游戏规则如下:
- 游戏人交替进行游戏
- 当轮到每个游戏人取子时,选择这些石子中的一堆,并从所选的堆中取走至少一个石子
(游戏人也可以取走他所选择的堆中的全部石子,于是留下一个空堆)
当所有的堆都变成空堆时,游戏结束。
最后取子(即能够取走最后一堆中剩下的所有石子)的游戏人,视为游戏的胜利者。
这种游戏称为NIM\operatorname{NIM}NIM游戏。
对于这种游戏,只有先手必胜和先手必败两种情况。
定理:
NIM\operatorname{NIM}NIM先手必胜,当且仅当A1xorA2xorA3xor⋯xorAnA_1\operatorname{xor}A_2\operatorname{xor}A_3\operatorname{xor}\cdots\operatorname{xor}A_nA1xorA2xorA3xor⋯xorAn不等于000
证明:
- 所有物品都被取光是一个必败局面(对手取走最后一件物品,对手已经获得胜利),此时显然有A1xorA2xorA3xor⋯xorAn=0A_1\operatorname{xor}A_2\operatorname{xor}A_3\operatorname{xor}\cdots\operatorname{xor}A_n=0A1xorA2xorA3xor⋯xorAn=0。
- 对于任意一个局面,如果A1xorA2xorA3xor⋯xorAn=xA_1\operatorname{xor}A_2\operatorname{xor}A_3\operatorname{xor}\cdots\operatorname{xor}A_n=xA1xorA2xorA3xor⋯xorAn=x不等于000,如果x二进制表示下最高位的1在第k位,那么至少存在一个石子AiA_iAi,它的第kkk位为1。显然Aixorx<AiA_i\operatorname{xor}x<A_iAixorx<Ai时,我们就能从AiA_iAi堆中取走若干柿子,使其变成AixorxA_i\operatorname{xor}xAixorx,从而得到了一个各堆石子数异或起来等于000的局面。
- 对面任意一个局面,如果A1xorA2xorA3xor⋯xorAn=0A_1\operatorname{xor}A_2\operatorname{xor}A_3\operatorname{xor}\cdots\operatorname{xor}A_n=0A1xorA2xorA3xor⋯xorAn=0,那么无论如何取柿子,得到的局面下各堆石子异或起来都不等于000。用反证法可以证明,假设AiA_iAi被取成了AixorxA_i\operatorname{xor}xAixorx,由于x=0x=0x=0,所以不满足从所选的堆中取走至少一个石子。
- 综上所述,NIM\operatorname{NIM}NIM先手必胜,当且仅当A1xorA2xorA3xor⋯xorAnA_1\operatorname{xor}A_2\operatorname{xor}A_3\operatorname{xor}\cdots\operatorname{xor}A_nA1xorA2xorA3xor⋯xorAn不等于000,证毕。