麻了,要是在考省赛之前看一看的话,包能写出来的,还不用浪费那么多时间
题目见acwing基础课
首先是Nim游戏
如果有两个石子堆,当两个堆石子数相同时,先手拿什么,后手跟着做,先手必输的,那么如果不同,先手先操作一下,让两堆相同,那就相当于他才是相同情况下的后手,必胜
石子堆的证明有点麻烦了,最终结论就是几堆石子的异或值不等于0,就是先手胜,等于0就是后手胜,二进制之后就是每一位上的1组合或不组合都算一种拿的方式,根据某个我不想多说的证明,如果几个值的异或值=x≠0,那么一定存在某个值a在x的最高位的那一位的值也是1,再根据另一个我不想多说的证明,把a-x的话,之后就是异或值为0。反正异或值为0的话,说明,每一位为1的都有偶数个,那就可以镜像照做了,这里还有一个拿走的x一定比那一堆个数小的证明,不多说。
然后就是集合Nim函数
这个就比较难理解了
首先是Mex运算:设S表示一个非负数集合,定义mex(S),为求出不属于集合S的最小非负数的运算
这个很关键
sg(x)=mex(sg(y1),y(2),....sg(yn)) y1....yn是对局面x进行操作所能达成的局面
就有张图,x到y1,y2...那种的,y又能到什么什么
sg(终点)=0
sg≠ 0的情况
那下一步就一定能到0,那我操作一下,你没得走了,我必赢
sg(x)=0 有哪几种情况呢
一种是终点,那确实哪里都到不了
另一种是下一步到不了0的,但又能到其他点,那我不能不干,干了到不等于0,那你操作一下我迟早要到终点,我必输
所以sg=0,必胜 sg≠0,必输
假设有好几张图
那每个起点都有一个sg值,根据mex的定义,比sg值小的值都是能一步能进入的局面,那你看,是不是就是随便拿的石子堆嘛,那就几个局面就是几个石子堆,能直接用Nim的结论
所以解法就是算每个的sg之后直接异或
台阶Nim
偶数上不用管,因为对手要是动偶数上的石子,你下一步再把那个挪到下一个偶数就行,最多到地面,每回合下来奇数台阶上的是不会变的
然后就是动奇数了,奇数台阶上的动了,就和进地面差不多了,只要你不蠢,那不就是每个奇数台阶都是一个石子堆,就是经典Nim游戏
拆分Nim
sg(a1)=sg(b1,b2)=sg(b1) xor sg(b2)
一堆换两堆
按之前那个,只是sg的算法变了