http://acm.hdu.edu.cn/showproblem.php?pid=5795
操作是可以拿走一堆里的任意几个,可以把一堆分成三堆
神他妈打sg表找规律,1e9范围当时看了根本没敢写sg函数啊。。。。。没接触过QAQ5555~
sg【i】=i(i!=8*k &&i!=8*k-1)
sg【8*k】=8*k-1
sg【8*k-1】=8*k
强推规律不如先暴一发
#include<bits/stdc++.h>
using namespace std;
int sg[100];
int book[100];
int dfs(int x)
{
if(sg[x]!=-1)
return sg[x];
memset(book,0,sizeof(book));
int i,j,k;
for(i=1;i<=x;i++)
{
for(j=1;j<=x-i;j++)
{
k=x-i-j;
if(k)
{
book[dfs(i)^dfs(j)^dfs(k)]=1;
}
}
}
for(i=0;i<x;i++)
{
book[dfs(i)]=1;
}
for(i=0;i<100;i++)
{
if(!book[i])
{
sg[x]=i;
return i;
}
}
}
int main()
{
memset(sg,-1,sizeof(sg));
for(int i=0;i<50;i++)
{
dfs(i);
}
// for(int i=0;i<50;i++)
// cout<<i<<" "<<sg[i]<<endl;
int T,i,n;
cin>>T;
while(T--)
{
scanf("%d",&n);
long long temp=0,a;
for(i=0;i<n;i++)
{
scanf("%lld",&a);
if(a&&(a%8==0))
a--;
else if(a%8==7)
a++;
temp^=a;
}
if(temp)
printf("First player wins.\n");
else
printf("Second player wins.\n");
}
return 0;
}