SG函数
int getSG(int n) //计算n个数的SG值
{
memset(SG,0,sizeof(SG));
for(int i=1;i<=n;i++){
memset(S,0,sizeof(S)); //初始化
for(int j=0;f[j]<=i && j<N ; j++){ //每次可以取的数量
S[SG[i-f[j]]]=1; //标记后继状态
}
for(int j=0;j<=i;j++){
if(!S[j]){ //mex操作,最小不存在的后继
SG[i]=j;
break;
}
}
}
}
//f数组即可以取的石子数量
//SG为SG函数值
//S为后继状态标记用的数组
SG定理
游戏和的SG函数等于各个游戏SG函数的Nim和。(也就是异或)
if(SG[n]^SG[m]^SG[p])
printf("Win\n");
else
printf("Fail\n");