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\)值必定增大,也就是必定走向必胜状态

浙公网安备 33010602011771号