思路
- 位数从高往低取,先记录下每个位数有几个为1的数字,如果最高位为1的数字有num个
- ①:如果num%4==1,那么只要先手的人第一步先选一个最高位为1的数,那么后面的人只要取一个,那么先手的人跟着取一个,那么最后肯定是先手的人拿了奇数个最高位为1的数,后手的人拿了偶数个最高位为1的数,这样第一个人必胜
- ②:如果num%2==0,那么无论num个数字怎么分配,最高位两个人都是相同的,所以直接判断下一个位即可
- ③:如果num%4==3,那么如果第一个人和①一样先手取一个num中的数字,那么第二个人只要跟着第一个人取即可,即第一个人再已经取了一个的基础上,如果再取一个,那么第二个人跟着也取一个即可,这样第一个人必输,所以不能先取,那么肯定是最后来取那num个数,所以只要判断一下除了那num个数字以外的数字的奇偶性来判断谁先开始那么些num个数,先拿的必输
代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=30;
int num[N];
int main(){
int T;
cin >> T;
while(T--){
int n;
cin >> n;
memset(num,0,sizeof num);
for(int i=0;i<n;i++){
int x;
cin >> x;
for(int j=0;j<=N;j++){
if((x>>j)&1)num[j]++;
}
}
int i=N;
for(;i>=0;i--){
if(num[i]%4==1){
cout << "WIN\n";
break;
}
if(num[i]%4==3){
if((n-num[i])%2){
cout << "WIN\n";
}else{
cout << "LOSE\n";
}
break;
}
}
if(i<0){
cout << "DRAW\n";
}
}
}