题目:
题解:
我们可以先从n根巧克力中取出m(m>0)根,使得xor之和为0,即把必败态留给对方,并且使剩下的n-m根如何取都不能使xor和为0,这实际上就是xor和为0的最长子序列,(剩下的巧克力棒不可能有xor和为0的了,因为0^0=0,我们选出来的就不是最长的子序列了)
这样对于每次添加进去的巧克力棒,胜者一直都是胜者,对于败者来说,如果他从n-m根中取新的巧克力棒,实际上就是新建一个xor和不为0的nim游戏,让对方再次回归必胜状态。
寻找是否有xor和=0的巧克力棒子序列,dfs。
代码:
#include <cstdio>
using namespace std;
int a[20],n;bool fff;
void dfs(int x,int use,int now)
{
if (x==n+1)
{
if (!now && use>0) fff=1;
return;
}
dfs(x+1,use,now);
dfs(x+1,use+1,now^a[x]);
}
int main()
{
for (int tt=1;tt<=10;tt++)
{
fff=0;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,0,0);
if (fff) printf("NO\n");else printf("YES\n");
}
}