打表找规律:下面代码里体现了如何打表
在题目的规则下:
x的子问题包括:
[0,x-1]以及(1,x-1),(2,x-2)……………;
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int num=1e6+10;
int sg[num];
bool vis[num];
void dfs(void)
{
sg[0]=0;sg[1]=1;
for(int x=2;x<=30;x++)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<x;i++)
vis[sg[i]]=1;//正常nim规则
for(int i=1;i<x;i++)
vis[sg[i]^sg[x-i]]=1;//将x拆分成两个子问题;
for(int i=0;;i++)
{
if(vis[i]==0) {
//if(x==2) printf("%d\n",i);
sg[x]=i;break;
}
}
}
}
inline LL getsg(LL a)
{
if(a%4==0) return a-1;
if(a%4==3) return a+1;
return a;
}
int main()
{
// dfs();
// for(int i=1;i<=30;i++)
// {
// printf("sg[%d]==%d\n",i,sg[i]);
// }
int t,n;
LL a,ans;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d",&n);
while(n--)
{
scanf("%lld",&a);
ans^=getsg(a);
}
printf(ans?"Alice\n":"Bob\n");
}
return 0;
}