http://acm.hdu.edu.cn/showproblem.php?pid=1536
给出能够取的方法序列,然后求基本石子堆问题。
只要用S序列去做转移即可。
注意has初始化的一些技巧
#include <iostream> #include <vector> #include <set> #include <cstdlib> #define LL long long using namespace std; const int N=10005,NM=105; int sg[N]; bool has[NM]; vector<int> mov; void make_sg() { fill(sg,sg+N,0); sg[0]=0; for(int i=1;i<N;i++) { fill(has,has+NM,0);//这里初始化只需要初始化S的数目即可,因为如果sg函数要达到k,必然1~k-1的数都被填充才有可能 for(int j=0;j<mov.size();j++) { if(i-mov[j]>=0) { has[sg[i-mov[j]]]=1; } } for(int j=0;j<N;j++) { if(has[j]==0) { sg[i]=j; break; } } } } int main() { cin.sync_with_stdio(false); int k; while(cin>>k) { if(k==0)break; mov.clear(); for(int i=0;i<k;i++) { int temp; cin>>temp; mov.push_back(temp); } make_sg(); int m; cin>>m; while(m--) { int l; cin>>l; int v=0; for(int i=0;i<l;i++) { int temp; cin>>temp; v^=sg[temp]; } if(v==0)cout<<'L'; else cout<<'W'; } cout<<endl; } return 0; }