首先总结一下sg函数(网上搜一下Nim游戏一大堆),在这样一种组合游戏中,每一个状态都可以从他转移到其他的一些状态,这些其他的状态叫做后继,定义mex函数就是求所有的后继中第一个没有出现的后继,而其重要的性质就在于如果一个状态的sg==0就为必败状态,否则就是必胜(只有一堆石子),如果有很多石子的话,又有一个性质就是每一堆的sg相互^以后得到的值就是这些很多堆的石子的又一个后继。
这里需要找规律,发现每8个一次循环,如果(x%8==0)sg=x-1 如果(x+1)%8==0 sg=x+1其余的sg=x,好吧,这个有点扯,多写几组数据就发现了
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,ans;
int main(){
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
scanf("%d",&n);
int x;
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(x%8==0)ans^=x-1;
else if((x+1)%8==0)ans^=x+1;
else ans^=x;
}
if(ans>0)printf("First player wins.");
else printf("Second player wins.");
return 0;
}/*
3
1 2 4*/