利用SG函数特性,和的SG函数等于单独SG函数的异或,然后对预处理SG函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int sg[10005]; 6 bool mark[10005][105]; 7 int s[105]; 8 int main() 9 { 10 int m; 11 while(scanf("%d",&m)&&m) 12 { 13 memset(mark,false,sizeof(mark)); 14 for(int i=0;i<m;i++) 15 scanf("%d",s+i); 16 sg[0]=0; 17 for(int i=0;i<=10000;i++) 18 { 19 for(int j=0;j<=102;j++) 20 { 21 if(!mark[i][j]) 22 { 23 sg[i]=j; 24 break; 25 } 26 } 27 int tp=sg[i]; 28 for(int j=0;j<m;j++) 29 if(i+s[j]<=10000) 30 mark[i+s[j]][tp]=true; 31 32 } 33 scanf("%d",&m); 34 while(m--) 35 { 36 int flag=0; 37 int n,tp; 38 scanf("%d",&n); 39 while(n--) 40 { 41 scanf("%d",&tp); 42 flag^=sg[tp]; 43 } 44 printf("%c",(flag!=0)?'W':'L'); 45 } 46 printf("\n"); 47 } 48 return 0; 49 }