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 }
~~Jason_liu O(∩_∩)O
原文地址:https://www.cnblogs.com/JasonCow/p/12337750.html