一个关于SG的博弈游戏,对于某个堆有MiMi和LiLi,那么这个堆的SG值为
SGi=Mi%(Li+1)
定义SG(x)=mex(S)),其中S是x的后继状态的SG函数值集合,mex(S))表示不在S内的最小非负的整数。
我们先取L=5来看一下
当M=1时,由于1的后继状态只有0,由sg定义可得sg[1]=mex{sg[0]}=1
,当M=2时,2的后继状态有0,1得到sg[2]=mex{sg[0],sg[1]}=2
当M=3时,3的后继状态有0,1,2有sg[3]=mex{sg[0],sg[1],sg[2]}=mex{0,1,2}=3s
…………
当M=5时,5的后继状态有0,1,2,3,4,有sg[5]=5
当M=6时,6的后继状态有1,2,3,4,5有sg[6]=mex{sg[1],sg[2]……sg[5]}=0
当M=7时,7的后继状态有2,3,4,5,6有sg[7]=mex{sg[2],sg[3],sg[4]……sg[6]}=1
如此一来 规律就好明显的有木有><.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main ()
{
int t;
scanf ( "%d" , &t );
while ( t-- )
{
int n;
scanf ( "%d" , &n );
int ans = 0;
for ( int i = 0 ; i < n ; i++ )
{
int a,b;
scanf ( "%d" , &a );
scanf ( "%d" , &b );
ans ^= a%(1+b);
}
if ( ans == 0 ) printf( "Yes\n" );
else printf( "No\n" );
}
}