C++-POJ2960-S-Nim-[限制型Nim]
每次只能从取集合S中个数的物品,其他和普通Nim游戏相同
预处理出每种物品堆的sg值,然后直接xor一下,xor-sum>0即必胜
1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 using namespace std; 12 #define N 10001 13 int k,m,l,s[101],sg[N],vis[N],ans,a; 14 int main(){ 15 while(scanf("%d",&k)&&k){ 16 for (int i=1;i<=k;i++)scanf("%d",&s[i]); 17 sort(s+1,s+k+1); 18 memset(sg,0,sizeof(sg));//sg[0]=0; 19 for(int i=1;i<N;i++){ 20 memset(vis,0,sizeof(vis)); 21 for(int j=1;j<=k&&s[j]<=i;j++)vis[sg[i-s[j]]]=1; 22 for(int j=0;;j++)if(!vis[j]){sg[i]=j;break;} 23 } 24 for(scanf("%d",&m);m--;){ 25 for(ans=0,scanf("%d",&l);l--;)scanf("%d",&a),ans^=sg[a]; 26 putchar(ans?'W':'L'); 27 } 28 puts(""); 29 } 30 return 0; 31 }