初识博弈的时候了解了P点和N点,进而可以学习SG定理及其函数
游戏和的SG函数等于各个游戏SG函数的Nim和
定义mex运算mex(s)表示最小的不属于S集合的非负整数
对于SG(x) = mex(s) S集合是遵守游戏规则的前提下取了石子之后,可能出现的所有的情况的集合也就是后继状态
void getsg(int n)
{
int i,j;
memset(SG,0,sizeof(SG));
for(int i = 1;i <= n;i++)
{
memset(S,0,sizeof(S));
for(int j = 0;j <= 10 && arr[j] <= i;j++)
{
S[SG[i - arr[j]]] = 1;
}
for(int j = 0;;j++)
{
if(!S[j])
{
SG[i] = j;
break;
}
}
}
}
代码的实现也擦不多,多对的情况异或一下hile(numsize--)
{
cin>>num;
ret ^= sg[num];
//cout<<sg[num]<<endl;
}