初学NIM浅谈感悟与疑点
初学NIM浅谈感悟与疑点
0.题面
NIM游戏
• 给定 n 堆石子,两位玩家轮流操作,每次操作可以从任 意一堆石子中拿走任意数量的石子(可以拿完,但不能 不拿),最后无法进行操作的人视为失败
数据范围 n = 100000 石子数量 10^9
我对本文做法的态度是:之所以要使用异或和,并不是一定要用,是因为这种题目结构恰好可以通过异或和求出其中的一种可行最优解,也就是还存在其他做法
1.我们把所有堆的石子数量进行异或。
我们考虑最终胜利时的状态是我们取走最后的数,那么场面上所有的堆都为0,则异或和为0。
现在我们考虑对异或和为0以及异或和不为0的局面进行操作可能出现的情况:
一.异或和为1:
1.存在并且一定存在一种操作使它的异或和变为零。
证:我们只需要让最大的堆减去一个数后等于除其之外其他所有堆得异或和
例:对于堆1,5,4,7
通过结合律,1,5,4异或得到0 0 0 0,那么我们就让 0 1 1 1 -= 0 1 1 1 - 0 0 0 0,得出需要让7减去7
2.可能存在操作后使它异或和仍然不为零的情况(例如最后只剩下1个石子的情况,其他情况下会不会出现尚未证实)。
二.异或和为0:
1.存在且仅存在操作使它的异或和不为零
证:我也不太会证啊!
大致是这样:
对于一个异或和为0的一组数据,我们要修改其中的某一个数据的某一位,那么根据异或的性质,我们可以得知除该数以外的所有数该位异或和与该数此位应当相同(相同为0,不同为1),那么我们修改该位以后它的该位与其他数该位的异或和就变为1,则更改后所有数异或和不为零。
所以对于一组异或和为0的数据,如果一定要修改,修改后异或和一定为非零。证毕。
那么得出一个小结论:
异或和为0一定会转移到异或和为1,异或和为1一定可以转移到0
2.以上段落及以下几行为本文核心。
那么作为对手的对手,是一定不会给对方留退路留选择的是吧(手动滑稽),所以我们想要自己最后从异或和不为零转移到没有物品的异或和为零,就要让对手从某一种状态转移到异或和不为零,(为了确保胜利)我们就给对方留一个一定会转移到异或和不为零的情况,也就是让对方选的时候异或和为零。
所以在双方足够聪明的前提下,局面的转移一定是:
异或和:0——!0——0——!0…………
也就是说每个人都会做出唯一的操作也就是将0变!0或!0变0
那么对于石子堆数与每堆的石子数确定的情况下,开局即结束。
所以根据上文得出的性质最后1变0的人获胜,也就是过程中以及开头1变0的人获胜
由此得出结论:
在一开始所有数异或和为1则先手胜
在一开始所有数异或和为0则先手败
至此解题完毕
笔记过于草率,若有缺失遗漏以及不妥处勿喷,欢迎私信本人或者发帖@我