Nim 游戏

Nim 游戏

题目介绍

绝顶聪明的 Alice 和 Bob 在玩游戏,地上有 \(n\) 堆石子,第 \(i\) 堆石头有 \(a_i\) 个,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取,最后没石子可取的人就输了。

显然对于一个确定的初始石头数,先手必胜或必败是确定的,不存在平局。假如 Alice 是先手,请问在什么条件下 Alice 必胜,在什么条件下 Alice 必败。

大家可以先从一些简单的情况开始分析,例如显然 \(n=1\) 时,先手必胜,\(n=2\) 时若 \(a_1=a_2\) 则先手必败,否则先手必胜。

前置知识

定义一个数 \(x=\sum\limits_{i=0}^{n}a_i\cdot 2^i\) 的二进制表示为 \((a_na_{n-1}a_{n-2}\dots a_0)_2\),其中 \(a_i\in \{0,1\}\),显然 \(\forall x\in N\) 都有唯一的二进制表示与之对应。

例如 \(3\) 的二进制表示为 \((11)_{2}\)\(10\) 的二进制表示为 \((1010)_2\)


定义二进制下异或运算为 “\(\oplus\)”,若 \(z=x\oplus y\),其中 \(x=(a_na_{n-1}\dots a_0)_2\)\(y=(b_nb_{n-1}\dots b_0)_2\)\(z=(c_nc_{n-1}\dots c_0)_2\),则若 \(a_i\)\(b_i\) 均为 \(0\)\(1\)\(c_i\)\(0\),否则 \(c_i\)\(1\)

例如 \(x=20=(10100)_2,y=13=(1101)_2\),则

\[x=(10100)_2 \]

\[y=\ \ (1101)_2 \]

\[z=(11001)_2 \]

可以将异或理解为不进位加法,显然异或运算满足交换律,即 \(x\oplus y=y\oplus x\),且对于 \(x\neq y\)\(x\oplus y\neq 0,x\oplus x=0\)

回到 Nim

先来说说 Nim 游戏的答案,令 \(\mathcal{T}=\oplus_{i=1}^n a_i\),若 \(T=0\) 则先手必败,若 \(T\neq 0\) 则先手必胜。

很神奇不是吗?如何证明呢?

对于 \(\mathcal{T}=0\),无论如何拿石子,拿完后 \(\mathcal{T}\) 都会变为非 \(0\) 的一个数。具体地,若拿的是第 \(i\) 堆石头,拿完后剩下 \(a_i'\)\(a_i'<a_i\)) 个石头,则 \(\mathcal{T}'=\mathcal{T}\oplus a_i\oplus a_i'\neq 0\)

对于 \(\mathcal{T}\neq 0\),总存在一种方法使得拿一次后 \(\mathcal{T}\) 变为 \(0\)。一种方法如下:若 \(\mathcal{T}\) 最高位为第 \(k\) 位,即 \(\mathcal{T}\) 在第 \(k\) 位为 \(1\),则一定存在 \(a_i\),其在第 \(k\) 位为 \(1\),令 \(a_i'=\mathcal{T}\oplus a_i\) 即可,此时 \(a_i'\) 一定小于 \(a_i\),且 \(\mathcal{T}'=\mathcal{T}\oplus a_i\oplus a_i'=0\)

因此若初始时 \(\mathcal{T}\neq 0\),Alice 可以拿完后让 \(\mathcal{T}'=0\),无论 Bob 怎么拿,\(\mathcal{T}''\) 都会变为一个非 \(0\) 的数,Alice 再将其变为 \(0\)。如此进行,则总会将石头取完,\(\mathcal{T}=0\),Bob 没有石头可以取,先手 Alice 必胜。

\(\mathcal{T}=0\),无论 Alice 怎么拿,\(\mathcal{T}'\) 都会变为一个非 \(0\) 的数,回到上面的情况,Alice 必败。

综上 \(T=0\) 则 Alice 必败,\(T\neq 0\) 则 Alice 必胜。

posted @ 2025-07-13 12:30  tx344  阅读(55)  评论(0)    收藏  举报