http://acm.hdu.edu.cn/showproblem.php?pid=5011
有N堆珠子,两个人轮流拿,最少拿一个,可以全拿,每次只能从一个堆里拿,不能从多堆同时拿;拿完之后该人还有一个操作,对操作的堆要么不动要么将该堆分成两部分(不一定均分),谁最后一个拿完谁获胜。
而无论怎么划分,划分过后的个数是不变的,所以直接对原来的堆数之间进行异或运算,结果为1,则第一个操作的人获胜,结果为0,第二个操作的人获胜。
#include<iostream> using namespace std; int main(){ int i,t,n,k,m; while(cin>>n){ m=0; t=0; for(i=0;i<n;i++){ cin>>k; if(k>=1) t++; m^=k; } if((m==0&&t>=2)||(m!=0&&t==0)) cout<<"Lose\n"; else cout<<"Win\n"; } return 0; }