hdu2176 尼姆博弈
如果 a1^a2^a3........^an=0,必败态。
如果 a1^a2^a3........^an!=0,必胜态。
对于必胜态,若a1^a2^a3........^an=k,要让对方为必败态,所以一定存在数,他的2进制有k的最高位上的1,使对方为必败态;
所以如果k^a[i]<a[i],一定是从该数中取,a[i]-k^a[i]个。
如果剩下一堆物品:必胜;
如果剩下二堆,都为1,必输;
如果剩下二堆,一堆为1,另一堆为n,必胜;
#include<stdio.h> #include<string.h> #define maxn 200010 int main() { int i,j,a[maxn],n; while(scanf("%d",&n)!=EOF) { if(!n)break; int flag; flag=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); flag^=a[i]; } if(flag==0) printf("No\n"); else { printf("Yes\n"); for(i=0;i<n;i++) { if((flag^a[i]) < a[i]) { printf("%d %d\n",a[i],flag^a[i]); } } } } }