Nim游戏规则:
两个人甲和乙的取石子游戏,共有N堆不同的石子,编号1..N,第i堆中有a[i]个石子。
每一次行动,甲和乙可以选择从一堆石子中取出任意数量的石子。至少取1个,至多取完。
两人轮流行动,取走最后一个石子的人获得胜利(当某人不能取时失败)。
问,两人均取最优策略,谁会胜利??
介绍一下博弈中两个概念:
P-position:当前局面为先手必败局面。
N-position:当前局面为先手必胜局面。
Nim游戏的一个神奇的结论:
对于一个局面,当且仅当a[1]xor a[2]xor ... xor a[N]=0时,这个局面为P局面
下面贴一下hihocoder的证明
对于这个结论的证明如下:
1. 全0状态为P局面,即A[i]=0,则A[1] xor A[2] xor ... xor A[N] = 0。
2. 从任意一个A[1] xor A[2] xor ... xor A[N] = k != 0的状态可以移动到A[1] xor A[2] xor ... xor A[N] = 0的状态。由于xor计算的特殊性,我们知道一定有一个A[i]最高位(我觉得这里不该是A[i]的最高位,而应为a[i]的k最高位是1,详细看证明)与k最高位的1是相同的,那么必然有A[i] xor k < A[i]的,所以我们可以通过改变A[i]的值为A[i]',使得A[1] xor A[2] xor ... xor A[i]' xor ... xor A[N] = 0。
3. 对于任意一个局面,若A[1] xor A[2] xor ... xor A[N] = 0,则不存在任何一个移动可以使得新的局面A[1] xor A[2] xor ... xor A[N] = 0。由于xor计算的特殊性,我们可以知道,一定是存在偶数个1时该位置的1才会被消除。若只改变一个A[i],无论如何都会使得1的数量发生变化,从而导致A[1] xor A[2] xor ... xor A[N] != 0。
由于第一三点比较容易理解,下面来简单证明一下第二点
假设k的最高位的1是在第j位,那么a数组中的数的所有j位异或起来得到1,那么就至少存在一个a[i],使得a[i]的j位是1。
那么a[i]xor k<a[i],这时我们把a[i]拿掉一部分就可以使得 a[1]xor a[2]xor ... xor a[N]=0,拿掉的部分就是a[i]-a[i]xor k,至于为啥是拿掉这么多,简单解释一下。
先说明一下,若a xor b=c,那么a xor c=b,b xor c=a(简单推理一下就知道了)
然后我们令x表示所有a数组中除a[i]之外的异或和,那么x xor a[i]=k,且有a[i] xor k=x啊
那么x xor (a[i] xor k)=x xor x=0,所以我们拿掉之后剩余a[i] xor k(注意这个数字是比a[i]小的,这个很关键)个石子就行了。
证毕。