(博弈论)关于Nim游戏以及异或操作的理解

最近看到了一个Nim游戏,看到了一篇博客,为CSDN博主「千寒」的原创文章,感觉对我理解很有帮助,理解后按我的思想来帮助大家理解,总结了一些东西。
原文链接:https://blog.csdn.net/qq_42809546/article/details/118893873

题面
洛谷P2197
有n堆石子(n >= 0), 每一堆有ai (ai > 0 , 1 <= i <= n)个石子。
每人每次可以从任意一堆石子里,取出任意多枚石子扔掉,可以取完,不能不取每次只能从一堆里取。最后没有石子可以取的人输掉这场游戏。
设甲为先手,乙为后手,两个人以最佳策略进行操作。
给出n ,和这n 堆石子分别的数量,请问是否存在先手必胜的策略?

答案:有一个结论:如果这n堆石子的数量满足:
a1 ^ a2 ^ a3 ^ ···· ^ an = 0
先手必败否则先手必胜

怎么得到这个结论呢 ?下面是我的理解。

铺垫:
(1)玩家对一堆石子的操作实际上等同于对该堆石子的异或。
对一堆石头ai操作,将其变为一个数 newai ,因为至少拿出一个石子,所以 newai < ai , 等价于 ai ^ x = newai 。
上面这句话翻译成人话就是:对 ai 操作一次相当于把 ai 变成了 newai,只不过可以通过异或运算来达到目的。
(2)根据异或运算结合律,对 ai 的一次异或运算其实就是对总体结果的(所有数字异或和)的一次异或运算。
(3)游戏结束(终结状态)是:当一粒石子都不剩,即a1 = a2 = a3 = ···· = an = 0 ,此时···········。
(4)异或有一个规律:当一堆数异或时,若在同一个二进制位上的1的个数是偶数,那么这一位异或后结果为0,否则为1。

先假设一个一般的状态:此时场上的局面为: a1 ^ a2 ^ a3 ^ ···· ^ an = k,假设此时我是先手,你是后手。

(情况一)k != 0 的情况。
异或和为 k ,k 不等于 0 ,设 k 的二进制位有 i 位, 那么 k 的最高位为,即 i 位为 1 。根据铺垫(4), a1 到 an 中 一定有奇数个数字的第 i 位为 1 。

现在思考一下如何才能获胜,为了我能获胜,我的目标是让你无石子可取,无石子可取时, a1 ^ a2 ^ a3 ^ ···· ^ an = 0 , 如果我每次操作都让你面对 a1 ^ a2 ^ a3 ^ ···· ^ an = 0 的情况,且我的每次使 a1 ^ a2 ^ a3 ^ ···· ^ an = 0 的操作都是通过减少石块数量完成的,石子数量为 0 的状况一定会在某次操作后出现,这时你无石子可取,输掉游戏。

那么怎么让每次异或结果为 0 ?我们知道,一个数异或自身等于 0 。所以让异或和再异或自身(即 k )就可以变为 0 。

根据铺垫(2),对异或和异或 等价于 对其中一个数(即一堆石子)异或。那么我们现在要考虑的就是我们要对那个数异或呢?

之前提到 a1 到 an 中一定有奇数个数字第 i 位为 1 ,选其中一个,对它异或,那么为什么要选这个数呢?
原因:设这个数为 aj ,aj ^ k = newaj ,newaj 一定小于 aj ,因为 k 的最高位(即 i 位)为 1 ,i 位左侧均为 0 ,所以 aj 中 i 位 左侧的数异或后仍不翻转(仍是原数不变),newaj 当中第 i 位左侧的数不会被异或影响。而第 i 位 变为 0 ,小于第 i 位 (即 i 位右侧)无论如何变化都不会影响第 i 位已经变为 0 的事实。 newaj 第 i 位为 0 , aj 第 i 位为 1 ,且 newaj 与 aj 第 i 位左侧数相同(左侧数没有变化,没有被异或影响)。

用式子来表示异或过程就是:
a1 ^ a2 ^ a3 ^ ···· ^ an ^ k
= k ^ k
= 0
且 a1 ^ a2 ^ a3 ^ ···· ^ an ^ k
= a1 ^ a2 ^ a3 ^ ···· ^ (aj ^ k) ^ ···· ^ an
= a1 ^ a2 ^ a3 ^ ···· ^ newaj ^ ···· ^ an

这样的异或(其实是对一堆石子操作)是正确的,因为 newaj < aj ,确实拿走了某一堆石子中的一些。

这时轮到你,你不管怎样操作(异或任何的非零正整数)(不能异或 0 ,异或 0 相当于没有取石子),都会使异或和(即 a1 ^ a2 ^ a3 ^ ···· ^ an 的结果)从 0 变为 一个非 0 的 newk。
又轮到我操作,而我接下来只需要一直重复上述操作,只不过把 k 变为 newk ,寻找新的 aj 而已。
因为我们的操作一直在减少石子总数,且我面对的永远是异或和不为 0 的情况,你面对的永远是异或和为 0 的情况。所以在某次操作后,你发现异或和为 0 的情况是由于所有石子被我拿完了而导致的,你无石子可取,输掉游戏。

这就是为什么异或和不为 0 ,先手必胜。

(情况二)k != 0 的情况
道理同上,只是这时你面对的永远是异或和不为 0 的情况,我面对的永远是异或和为 0 的情况。所以在某次操作后,我无石子可取,输掉游戏。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值