题目链接:http://codeforces.com/problemset/problem/603/C
这题是公平组合博弈。对于给定的每堆奶牛,有两种操作,一是减少一只奶牛,二是将奶牛减半并变成k堆。其实第二种操作就相当于游戏分成了许多子游戏,子游戏的SG异或和仍然对应游戏的SG值。
这题最关键的思路是要想到k分奇偶讨论,然后打表找一下规律。
如果k是偶数
当选择2时,有k个n个石子的小堆,状态的sg函数显然为f(n) xor自身 k次=0。
此时我们可以计算得出f(0..4)={0,1,2,0,1},并且可证明对于n>=2,有f(2n-1)=0,f(2n)=1,化简得f(n)=1-(n%2),或f(n)=n&1^1。
对于f(2n-1),我们只能移动到2n-2个石子的状态(游戏1),又f(2n-2)=1>0,所以f(2n-1)=mex{1}=0。
对于f(2n),可以移动到2n-1的状态(游戏1),或者游戏2,游戏1和2的sg函数值都为0,所以f(2n)=mex{0}=1。
如果k是奇数
此时对于2n个石子的石堆,状态的sg函数为f(n)xor自身k次=f(n)。推导出f(0..5)={0,1,0,1,2,0}。可证明对于n>=2,f(2n)>0,f(2n+1)=0。
对于f(2n+1),我们只能移动到2n,有f(2n)>0,所以f(2n+1)=0。
对于f(2n),可以移动到2n-1,f(2n-1)=0,所以f(2n)>0。且f(2n)=mex{f(2n-1),f(n)}=mex{0,f(n)},递归计算即可。
引用自huanghongxun的博客