Nim游戏

Nim 游戏

题目描述

甲,乙两个人玩 nim 取石子游戏。

nim 游戏的规则是这样的:地上有 n 堆石子(每堆石子数量小于 10^4),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 \(n\) 堆石子的数量,他想知道是否存在先手必胜的策略。

分析

总结论 每堆石子数异或和为0则必输,否则必赢

必输状态定义:没有后继情况(没石子了)或者后继状态都是必赢状态(比较显然)

必赢状态定义:后继状态存在必输状态(因为十分滴聪明,所以肯定会选最利于自己的)

所以对于这种游戏,每一种状态肯定是确定了必赢或者必输,(有点用结论说明条件了,不过也比较合理)

现在来证明总结论

结论1 必赢状态一定是异或和非0状态,并且有后继状态为必输状态,即0

考虑假设现在有一种状态的异或和为一个非0的数\(S\)

我们将求\(S\)的式子列出来:a[1] ^ a[2].....^ a[n]= S
a[i]为石堆i石子数量

我们现在要进行的操作是从某一个石堆中取出一些石子,我们要判断的是能否通过一次这样的操作,让整体状态变成必输态,也就是异或和为0
假定\(S\)最高位(二进制最靠左的那个1的位置)为\(k\)(在最右边的二进制位是第一位的定义下)

考虑异或的性质,对于某一位二进制位,如果存在偶数个相同的数字,两两匹配结果肯定为0,所以对于\(n\)堆石子的异或和,第\(k\)位有数字的石堆数量一定是奇数个

知道了这个\(k\)有什么用呢?考虑我们怎么将原式的值变成 \(0\)

看等号右边的\(S\),任何数与自身异或的结果都为0,所以等式两边都异或上一个\(S\)结果就会变成0
根据异或运算满足结合律,这个\(S\)放在左式的任何位置都是不会有影响的

考虑等式左边的式子异或上0是否是我们进行一次操作可以做到的事
发现因为第\(k\)位是\(S\)的最高位,假如a[t]第\(k\)位也为1(肯定是存在的)那么这两个数进行异或所得到的结果一定是小于a[t]的

为什么呢?考虑在\(k\)位之前,\(S\)都是0,所以前面的异或结果和a[t]的一样,而第\(k\)位两数相等则为0,这样无论后面怎么样,异或结果都一定必a[t]小,所以这是我们一次操作可以做到的

考虑若必胜情况为0,\(k\)就为0了,那无法进行任何操作还算啥必胜

结论2 必输状态一定是异或和为0,并且没有后继状态或者后继状态都为必胜状态,即非0

还是列出式子:\(S\) = a[1] ^ a[2].....^ a[n]

若a中都为0,那不用想肯定取不了必输

而不都为0,那么改变任何一个数,都会引起某些二进制位上1的数量不再是偶数,那么\(S\)值必定增大,也就是必定走向必胜状态

至此证毕

posted @ 2024-11-20 21:08  hapihapi  阅读(99)  评论(0)    收藏  举报