题目
你和朋友Amit面前有4只樱桃碗,里面分别装着\(5,6,7,8\)颗樱桃。
你们轮流行动;每次可以任选一只碗,并从中取走至少1颗樱桃。
如果你先手,并且想确保最后一颗樱桃是Amit取走的,那么你的第一步应该从哪只碗里取走几颗樱桃?
分析
这是一个经典的Nim变形题。
它和前面的普通版本正好成对出现;如果你想对照着看,可以参考Life Is a Bowl of Cherries。
如果题目目标是“让对方拿到最后一颗”,那么这就是所谓的misere Nim。这里一开始4堆樱桃的数量分别是\(5,6,7,8\),并且至少有两堆的数量大于\(1\),所以在这种局面下,最优策略和普通Nim完全一样:先把4堆的异或和调成\(0\)。
原因是:misere Nim和普通Nim的唯一区别,只出现在残局“所有非空堆都只剩\(1\)颗”时。因为到了那个阶段,玩家已经不能再通过“多拿几颗”改变局面的结构,只能每次消去一个\(1\)。
而在此之前,只要还存在某一堆大于\(1\),局面就和普通Nim一样,仍然可以用“把异或和调成\(0\)”这一标准策略来控制节奏,把对手反复送回到必败型局面。
把4个数写成二进制:
- \(5=0101\)
- \(6=0110\)
- \(7=0111\)
- \(8=1000\)
它们的异或和是\(5\oplus6\oplus7\oplus8=12\)。
因此先手应当把某一堆改成“原数异或\(12\)”之后得到的更小值。逐个检查:
- \(5\oplus12=9\),比\(5\)大,不能这样改;
- \(6\oplus12=10\),比\(6\)大,不能这样改;
- \(7\oplus12=11\),比\(7\)大,不能这样改;
- \(8\oplus12=4\),比\(8\)小,可以把这一堆从\(8\)改成\(4\)。
所以你的第一步应当是:从装有8颗樱桃的碗里拿走4颗。
这样局面就变成\(5,6,7,4\),而\(5\oplus6\oplus7\oplus4=0\)。
不过,这里有一个关键细节:不能把“始终把异或和调成\(0\)”这件事机械地执行到最后。
正确的做法是:在还有至少两堆樱桃数大于\(1\)时,策略和普通Nim完全一样,也就是每次都把局面重新调成异或和\(0\)。这样反复进行,局面最终会进入这样一种残局:只剩一只碗里多于\(1\)颗樱桃,其余每个非空碗里都恰好只剩\(1\)颗。
设这时除了那只“较大的碗”之外,另外还有\(m\)只碗各剩\(1\)颗樱桃。
这时就不能再照搬普通Nim的规则了,而要改用misere Nim的残局策略:
- 如果\(m\)是奇数,就把那只较大的碗一次拿空;
- 如果\(m\)是偶数,就把那只较大的碗减到只剩\(1\)颗。
这样做的目的,是把一个奇数个\(1\)的局面留给Amit。
因为当所有非空碗里都只剩\(1\)颗樱桃时,玩家每一步都只能拿走其中一整碗,也就是拿走一个\(1\)。于是:
- 面对\(1\)个\(1\)的人会立刻输,因为他只能拿走最后一颗;
- 面对\(2\)个\(1\)的人会赢,因为他拿走一个后,给对方留下\(1\)个;
- 一般地,面对奇数个\(1\)的人必败,面对偶数个\(1\)的人必赢。
所以,无论\(m\)的奇偶如何,你都可以在这个阶段把“奇数个\(1\)”留给Amit。此后双方只能一颗一颗地拿,奇偶性轮流变化,最后就会轮到Amit去拿那最后一颗樱桃。

