ECNU1328

/*
这个题目和那个连续线段的sg游戏很像。也是要连续的取值。但是这样堆会增加。
所以则求sg的时候,要考虑各种子情况。
没看懂题目,有点纠结啊
*/

#include <cstdio>
#include <cstring>

int S[3];
int M;
int N;
int sg[1010];
bool used[1010];

int dfs(int n)
{
	int& cur = sg[n];
	if( cur!=-1 ) return cur;

	memset(used,0,sizeof(used));
	for(int i=0;i<3;i++)
	{
		if(n>=S[i])
		{
			for(int j=0;j<=n-S[i];j++)
			{
				used[ dfs(j)^dfs(n-S[i]-j) ]  =1;
			}
		}
	}
	for(int i=0;;i++)
	{
		if( !used[i])
		{
			cur = i;
			break;
		}
	}
	return cur;
}

int main()
{
	while(scanf("%d %d%d",S,S+1,S+2)==3)
	{
		scanf("%d",&M);
		memset(sg,-1,sizeof(sg));
		sg[0] = 0;
		for(int i=0;i<M;i++)
		{
			scanf("%d",&N);
			if( dfs(N) )
			{
				printf("1\n");
			}
			else printf("2\n");
		}
	}
	return 0;
}
posted @ 2011-06-15 00:54  AC2012  阅读(127)  评论(0编辑  收藏  举报