题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2897
打表找一下规律,你会发现在n%4=0时,sg[n]=n-1;在n%4==3时,sg[n]=n+1;其他时,sg[n]=n。
打表代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 156
int s[maxn],sg[maxn];
void init()
{
memset(sg,0,sizeof(sg));
for(int i=1;i<=100;i++)
{
memset(s,0,sizeof(s));
for(int j=0;j<i;j++)///堆中移除
{
s[sg[j]]=1;
}
for(int j=1;j<=i/2;j++)///分成两堆时 两子堆进行亦或 为后继状态
{
s[sg[j]^sg[i-j]]=1;
}
for(int j=0;;j++)
{
if(!s[j])
{
sg[i]=j;
break;
}
}
}
for(int i=0;i<100;i++)
printf("%d sg:%d\n",i,sg[i]);
}
int main()
{
init();
return 0;
}
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int s[123],sg[123];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int ans;
ans=0;
for(int i=0;i<n;i++)
{
int m;
scanf("%d",&m);
if(m%4==0)
m=m-1;
else
if(m%4==3)
m=m+1;
ans^=m;
}
if(ans)
printf("Alice\n");
else
printf("Bob\n");
}
return 0;
}