nim游戏及其变种
nim游戏:
n堆石子,操作为可以从任意一堆拿走任意正整数个石子,不能操作者输。问先手胜还是后手胜。
结论:
当n堆石子的个数的亦或为0时,先手必败;否则先手必胜。
证明:
1,若亦或值不为0,则一定可以通过一步操作让它变成0.
考虑亦或值最高位的那个1,一定有一堆石子数在那一位是1(否则总的亦或里的那个1是怎么来的=-=)。我们让该堆石子那一位的1变成0,再对该数把总亦或里剩下的1的位置取反,那么这堆石子肯定是减少的(因为把一个高位的1变成0之后,低位再怎么改变也肯定是减小的)。
2,若亦或值为0,则无法通过一个操作让它保持0
貌似是显然吧...因为改变一个数之后肯定有些位置从0变成1,有些位置从1变成0.
题目:
一个n个台阶的楼梯,每个楼梯上有ai个石子。操作为可以拿从一层楼梯上拿若干个石子到下一层楼梯(不能不拿),拿到地面上的石子不能再拿。问先手胜还是后手胜。
题解:
通过后手相消的原则,我们可以发现偶数层楼梯上的石子是无效的(因为如果一方从偶数层上拿了若干石子到奇数层,另一方再把它们拿到偶数层就可以了,而地面(第0层)是偶数层,所以最终这些石子是没有意义的)。
所以这就是奇数层上石子的nim游戏。
题目:
一个n个台阶的楼梯,每个台阶上有ai个石子。操作为可以把一个石子拿到下面任何一个台阶(或地面),地面上的石子不能再拿。问先手胜还是后手胜。
题解:
把每个石子看做nim游戏中的一堆即可。
nim-k:
n堆石子。操作为可以从这n堆石子中挑选不超过k堆石子(至少1堆),每堆取任意个(至少1个,不同堆取的石子数可以不同)。问先手胜还是后手胜。
结论:
把每堆石子数转换成二进制数后相加(不进位),再把每一位 mod (k+1),若最终每一位都是0,则后手胜,否则先手胜。
证明:
和nim游戏的证明很像,建议读者自己想一想(凭各位的聪明才智一定没有问题的qwq)。
Take-and-Break Game:
n堆石子,每次可以取走一堆石子,然后放入两堆规模更小的石子(可以为0).最后不能操作的人输。
题解:
容易看出每堆石子都是单独的,所以可以用SG定理求解。(还不了解sg定理的同学可以点这里)
然后枚举x能转移到的所有状态,算出这些后继的sg值后取mex即可。(x的一个后继为sgi^sgj,i<x,j<x)。用记忆化搜索,复杂度O(n).
本人蒟蒻一枚,若博客中有错误请各位大佬指出qwq