ZJU2083

/*
博弈问题,sg游戏。
计算sg值。这里每次操作之后,会产生两个子问题。所以异或之后才是这次操作之后的sg值,然后选择一个不在
这个sg集合中的最小的自然数。就ok了。easy....
*/

#include <cstdio>
#include <cstring>

int sg[55];
bool used[55];
int N;

void init()
{
	sg[0] = 0;
	sg[1] = 0;
	sg[2] = 1;
	
	for(int i=3;i<=50;i++)
	{
		memset(used,0,sizeof(used));
		for(int j=0;j<=i-2;j++)
		{
			used[ sg[j]^sg[i-2-j] ] = 1;
		}

		for(int j=0;j<=50;j++)
		{
			if( !used[j] )
			{
				sg[i] = j;
				break;
			}
		}
	}
}

int main()
{
	init();

	int a,ans;
	while(scanf("%d",&N)==1)
	{
		ans = 0;
		for(int i=0;i<N;i++)
		{
			scanf("%d",&a);
			ans ^= sg[a];
		}

		if(ans) printf("Yes\n");
		else printf("No\n");
	}

	return 0;
}
posted @ 2011-06-14 13:16  AC2012  阅读(165)  评论(0编辑  收藏  举报