博弈之Nim游戏

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]小的,这个很关键)个石子就行了。

证毕。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值