sg函数

参考博客:https://blog.csdn.net/strangedbly/article/details/51137432

hdu 1536

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=110,maxm=10000+10;
int n;
int s[maxn],sg[maxm];
int  getsg(int x)
{
	if(sg[x]!=-1)return sg[x];
	bool vis[maxn];
	for(int i=0;i<maxn;i++)vis[i]=0;

	for(int i=1;i<=n;i++)
	{
		if(s[i]<=x)
		{
			getsg(x-s[i]);
			vis[sg[x-s[i]]]=1;
		}
	}

	for(int i=0;;i++)
		if(vis[i]==0)
			return sg[x]=i;
}
int main()
{
	int m;
	while(scanf("%d",&n)==1)
	{
		if(n==0)break;
		for(int i=1;i<=n;i++)
			scanf("%d",&s[i]);
		for(int i=0;i<maxm;i++)sg[i]=-1;
		scanf("%d",&m);
		sg[0]=0;
		for(int i=1;i<=m;i++)
		{
			int ans=0;
			int k;
			scanf("%d",&k);
			for(int j=1;j<=k;j++)
			{
				int gg;
				scanf("%d",&gg);
				ans^=getsg(gg);
			}
			if(ans!=0)printf("W");
			else printf("L");
		}
		cout<<endl;
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/9115987.html