题目链接
题目类型:sg函数
题目来源:2016 Multi-University Training Contest 6
题目分析
题目大意
一个可以拆堆的Nimm博弈。
现在有n堆石子,每个人可以在一堆棋子中取若干个,也可以不取,将任意一堆棋子拆成三堆棋子,三堆棋子中每一堆都至少有一个棋子,两人都选择最优方案操作,问最后谁赢谁输
解析
首先,这个博弈问题可以根据这n堆的sg值的异或和是否为0判断胜负,那么我们现在要找的就是对于有n个棋子的堆的sg值。
好吧,我们来手推一下。
我们用n表示当前堆的棋子数量,sg[n]表示该堆棋子的sg值,mex(Set S)表示不属于S的最小非负整数。
n=0时,当前玩家必败,sg[0]=0
n=1时,当前玩家可以选取1个棋子转移到n=0的情况,sg[1]=mex\left{ sg[0]\right}=mex\left{ 0\right}=1
n=2时,当前玩家可以选取\left{ 1, 2\right}个棋子转移到n=\left{ 1, 0\right}的情况,sg[2]=mex\left{ sg[1], sg[0]\right}=mex\left{ 0, 1\right}=2
n=3时,当前玩家可以选取\left{ 1, 2, 3\right}个棋子转移到n=\left{ 2, 1, 0\right}的情况,还可以将3拆成三堆含有1个棋子的情况,sg[3]=mex\left{ sg[2], sg[1], sg[0], sg[1]⨁sg[1]⨁sg[1]\right}=mex\left{ 2, 1, 0, 1\right}=3
n=4时,当前玩家可以选取\left{ 1, 2, 3, 4\right}个棋子转移到n=\left{ 3, 2, 1, 0\right}的情况,还可以将4拆成1+1+2个棋子的情况,sg[4]=mex\left{ sg[3], sg[2], sg[1], sg[0], sg[1]⨁sg[1]⨁sg[2]\right}=mex\left{ 3, 2, 1, 0, 2\right}=4
n=5时,当前玩家可以选取\left{ 1, 2, 3, 4, 5\right}个棋子转移到n=\left{ 4, 3, 2, 1, 0\right}的情况,还可以将5拆成1+2+2或者1+1+3个棋子的情况,sg[5]=mex\left{ sg[4], sg[3], sg[2], sg[1], sg[0], sg[1]⨁sg[2]⨁sg[2], sg[1]⨁sg[1]⨁sg[3]\right}=mex\left{ 4, 3, 2, 1, 0, 1, 3\right}=5
n=6时,当前玩家可以选取\left{ 1, 2, 3, 4, 5, 6\right}个棋子转移到n=\left{ 5, 4, 3, 2, 1, 0\right}的情况,还可以将6拆成1+2+3或者1+1+4或者2+2+2个棋子的情况,sg[6]=mex\left{ sg[5], sg[4], sg[3], sg[2], sg[1], sg[0], sg[1]⨁sg[2]⨁sg[3], sg[1]⨁sg[1]⨁sg[4], sg[2]⨁sg[2]⨁sg[2]\right}=mex\left{ 5, 4, 3, 2, 1, 0, 0, 4, 2\right}=6
n=7时,该情况比较特殊,当前玩家可以选取\left{ 1, 2, 3, 4, 5, 6, 7\right}个棋子转移到n=\left{ 6, 5, 4, 3, 2, 1, 0\right}的情况,还可以将7拆成1+1+5或者1+2+4或者1+3+3或者2+2+3个棋子的情况,sg[7]=mex\left{ sg[6], sg[5], sg[4], sg[3], sg[2], sg[1], sg[0], sg[1]⨁sg[1]⨁sg[5], sg[1]⨁sg[2]⨁sg[4], sg[1]⨁sg[3]⨁sg[3], sg[2]⨁sg[2]⨁sg[3]\right}=mex\left{ 6, 5, 4, 3, 2, 1, 0, 5, 7, 1\right}=8
n=8时,该情况比较特殊,当前玩家可以选取\left{ 1, 2, 3, 4, 5, 6, 7, 8\right}个棋子转移到n=\left{ 7, 6, 5, 4, 3, 2, 1, 0\right}的情况,还可以将8拆成1+1+6或者1+2+5或者1+3+4或者2+2+4或者2+3+3个棋子的情况,sg[8]=mex\left{ sg[7], sg[6], sg[5], sg[4], sg[3], sg[2], sg[1], sg[0], sg[1]⨁sg[1]⨁sg[6], sg[1]⨁sg[2]⨁sg[5], sg[1]⨁sg[3]⨁sg[4], sg[2]⨁sg[2]⨁sg[4], sg[2]⨁sg[3]⨁sg[3]\right}=mex\left{ 8, 6, 5, 4, 3, 2, 1, 0, 6, 6, 6, 4, 2\right}=7
后面就不一一推了,再找几个数可以发现,当$n = 8 k - 1时sg[n] = 8 k,当n = 8 k时,sg[n] = 8 k - 1,其他情况sg[n] = n$
通过上面的方式我们可以求出对于一堆来讲,他的sg值,然后将这n堆的sg值异或起来,若为0则为必败,否则必胜。
类似的博弈题目还有2016年多校第六场的HDU5724,比这题稍难一些。我的题解传送门
代码
1 |
|