构造SG函数:sg[i]表示2*i的sg值!!
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #define ll __int64 9 #define pi acos(-1.0) 10 #define MAX 5000 11 using namespace std; 12 int an[2][MAX],sg[MAX]; 13 bool vis[MAX]; 14 int getsg(int x) 15 { 16 int i; 17 if(sg[x]>=0) return sg[x]; 18 memset(vis,0,sizeof(vis)); 19 for(i=0;i<=x-i-1;i++) 20 vis[getsg(i)^getsg(x-i-1)^1]=1; 21 for(i=0;i<=x-i-2;i++) 22 vis[getsg(i)^getsg(x-i-2)]=1; 23 i=0; 24 while(vis[i]) i++; 25 return sg[x]=i; 26 } 27 int main(){ 28 int t,m,n,s,c,ans,i,k=0,len; 29 memset(sg,-1,sizeof(sg)); 30 sg[0]=0; 31 for(i=1;i<=4747;i++) sg[i]=getsg(i); 32 scanf("%d",&t); 33 while(t--){ 34 scanf("%d %d",&n,&m); 35 memset(an,0,sizeof(an)); 36 for(i=0;i<m;i++){ 37 scanf("%d %d",&s,&c); 38 an[s-1][c-1]=1; 39 } 40 ans=0;len=0; 41 for(i=0;i<n;i++){ 42 if(an[0][i]||an[1][i]){ 43 ans^=sg[len]; 44 ans^=an[0][i]; 45 ans^=an[1][i]; 46 len=0; 47 } 48 else len++; 49 } 50 ans^=sg[len]; 51 printf("Case %d: %s ",++k,ans?"Alice":"Bob"); 52 } 53 return 0; 54 }