SG函数+1;
由于题目给的数据很大,直接写SG 肯定会超时,这时候就只能打表找规律了。
打出SG函数的表,然后找出规律。
实在看不出就往下滑吧。
打表SG:
#include<stdio.h>
#include<string.h>
int sg[1007],vis[1007];
int main()
{
sg[0]=0;sg[1]=1;
int j;
for(int i=2;i<=100;i++)
{
memset(vis,0,sizeof(vis));
for(j=1;j<i;j++)vis[sg[j]^sg[i-j]]=1;
for(j=0;j<i;j++)vis[sg[j]]=1;
for(j=1;;j++)if(!vis[j])break;
sg[i]=j;
printf("%d %d\n",i,j);
}
}
规律自己找咯!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
int main()
{
int T,n,x;
scanf("%d",&T);
while(T--)
{
int ans=0;
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);
if(x%4==3)
ans^=(x+1);
else if(x%4==0)
ans^=(x-1);
else
ans^=x;
}
if(ans) puts("Alice");
else puts("Bob");
}
return 0;
}
规律:
SG[4K+4]=4K+3;
SG[4K+3]=4K+4;
SG[4K+1]=4K+1;
SG[4K+2]=4K+2;