链接:http://poj.org/problem?id=2960
1 #include<stdio.h> 2 #include<string.h> 3 const int N = 10001; 4 const int M= 101; 5 int SG[N];//SG[i]记录一堆i颗石子的SG状态 6 int s[M];//存储可选取的石子数目集合 7 int k;//s[]集合中的元素个数 8 int mex(int x) 9 { 10 if( SG[x]!=-1 )return SG[x]; 11 bool vi[N]={0}; 12 for( int i=0; i<k; ++ i ){ 13 if( s[i] <= x ){ 14 vi[mex(x-s[i])]=1; 15 } 16 } 17 int i=0; 18 while(vi[i])++i; 19 return SG[x]=i; 20 } 21 int main() 22 { 23 while(scanf("%d",&k)!=EOF)//可选集合中的元素个数 24 { 25 if(k==0)break; 26 int i,ans; 27 for(i=0; i<k; i++) 28 scanf("%d",&s[i]); 29 memset(SG,-1,sizeof(SG)); 30 SG[0]=0; 31 int m; 32 scanf("%d",&m);//测试组数 33 while(m--) 34 { 35 ans=0; 36 int l; 37 scanf("%d",&l);//石子堆数 38 while(l--) 39 { 40 int x; 41 scanf("%d",&x);//当前堆石子数目 42 if(SG[x]==-1) 43 SG[x]=mex(x); 44 ans=ans^SG[x]; 45 } 46 47 if(ans==0)printf("L"); 48 else 49 printf("W"); 50 } 51 52 printf(" "); 53 } 54 55 return 0; 56 }