sg[0]=0
当x=8k+7时sg[x]=8k+8,
当x=8k+8时sg[x]=8k+7,
其余时候sg[x]=x;(k>=0)
打表找规律可得,数学归纳法可证。
ACcode:
#include <bits/stdc++.h>
using namespace std;
int sg[105];
int getSG(int x){
if (sg[x] != -1) return sg[x];
int vis[105];
memset(vis, 0, sizeof(vis));
for (int i = 0;i < x; i++)
vis[getSG(i) ] = 1;
int a,b,c;
for(a = 1; a <= x; a++)
for(b = a; b <= x - a; b++)
for(c = b; c <= x - a - b; c++)
if(a+b+c == x)
vis[getSG(a) ^ getSG(b) ^getSG(c)] = 1;
for(int i = 0;; i++)
if(!vis[i]) return sg[x] = i;
}
void doit(){
memset(sg,-1,sizeof(sg));
for(int i=0;i<=100;++i)cout<<i<<" "<<getSG(i)<<'\12';
}
int main(){
// doit();
int n,t,sg=0,loop;
scanf("%d",&loop);
while(loop--){
scanf("%d",&n);
sg=0;
for(int i=0;i<n;++i){
scanf("%d",&t);
if(t%8==7)sg^=(t+1);
else if(t%8==0)sg^=(t-1);
else sg^=t;
}
if(sg)puts("First player wins.");
else puts("Second player wins.");
}
return 0;
}