思路:
对于一组数,必胜态肯定是所有数异或后不为0
必败态的话异或之后为0;
必胜态可以转换成必败态。
即从a[i]中选择一个数是他变成其他所有a[i]数的异或和。这样最终异或值为0,使得对手陷入必败态。
相关知识可以查看http://blog.csdn.net/acm_cxlove/article/details/7854530
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[220000];
int main()
{
int m;
while(~scanf("%d",&m),m)
{
int ans=0;
for(int i=0;i<m;i++)
{
scanf("%d",&a[i]);
ans^=a[i];
}
if(ans==0)
puts("No");
else
{
puts("Yes");
for(int i=0;i<m;i++)
{
int s=ans^a[i];
if(s<a[i])
printf("%d %d\n",a[i],s);
}
}
}
}