atcoder ARC C 01-Game (博弈, Grundy数)
https://atcoder.jp/contests/arc151/tasks/arc151_c
题意: 有1* n的的网格,有一些位置填有0和1,现在A和B进行游戏,往网格上填0/1,要保证相邻两个格子不能相同。A先手,问最后谁赢。
如果游戏能被划分成n个部分,那么每个部分的Grundy数的异或和为0则后手胜,否则先手胜利。
官方题解:
n是一个连续空段的长度
证明:
对于前两种情况: n较小时候可以模拟得到,n较大时候发现:如果两端不同,那么先手放完得到一个两端相同和一个两端不同的状态,那么后手可以操作两端相同的状态把他变成两端不同,这样先手在下一轮又面对两端不同,直到n被分成很小,我们已经知道n很小时候先手输,所以有先手必输,后手必胜grundy数是0;两端相同先手必胜,后继状态后手必胜 grundy数是1.
第三种情况: 容易看出先手必胜,但是grundy数不知道是多少。从n为1开始模拟,发现i+1的后继状态是0-i,那么长度i+1的grundy数是i的grundy数+1.
第四种情况:先手不想输只能往中间放,所以AB一直贴着放,直到没有空位。 grundy数取决于n的奇偶。