提议分析:
1 <= N <= 4747
很明显应该不会有规律的,打表发现真没有
按题意应该分成两种情况考虑,然后求其异或(SG函数性质)
(1)找出单独的一个(一列中只有一个)
(2)找出连续的两个都没有涂色的求SG值(打表)
#include<stdio.h> #include<string.h> #define Max 4750 int dp[Max]; int mex[Max]; int flag[Max]; void Gsdp() { int i,j; int l,r; dp[0]=0; dp[1]=0; for(i=2; i<Max; i++) { for(j=1; j<=i; j++) { l=j-1; r=i-j;//分成左中右 mex[dp[l]^1^dp[r]]=i;//涂色1 if(j+1<=i) { l=j-1; r=i-(j+1); mex[dp[l]^dp[r]]=i;//涂色2*2 } } //for(j=0; mex[j]==i; j++)少了分号 j=0; while(mex[j]==i)j++; dp[i]=j; } //printf("#%d ",dp[13]); } int main() { int t,n,m,ans; int x,y; int i,j,k; Gsdp(); scanf("%d",&t); for(i=1; i<=t; i++) { scanf("%d %d",&n,&m); memset(flag,0,sizeof(flag)); for(j=1; j<=m; j++) { scanf("%d %d",&x,&y); flag[y]++; } int tmp2=0,tmp1=0; ans=0; for(j=1;j<=n;j++) { if(flag[j]==1)tmp1++;//单独一个 if(!flag[j])tmp2++; else { ans^=dp[tmp2]; tmp2=0; } } ans=ans^(tmp1%2)^dp[tmp2]; printf("Case %d: ",i); if(ans)printf("Alice "); else printf("Bob "); } }