AtCoder Regular Contest 131
C - Zero XOR
什么时候可以赢?
当一个数等于当前所有数异或时。取出这个数,剩下所有数异或就为0.
因为:
11101
01100 异或 = 10001 相同0不同1. 一个数异或0还是本身
那么结束游戏有两种情况:
1、当N为奇数时,先手总能胜。
选手可以在本局直接赢,或者在第k-2局 例如 7 5 3 1局赢
2、当N为偶数时,先手必须一把赢,否则对方将面临奇数个饼干,对方一定胜。
先手一把赢的条件就是数列中存在一个数与所有数的异或相同。
#include <iostream>
using namespace std;
const int N = 400010;
int n;
int a[N];
long long e;
int main()
{
cin >> n;
if(n%2)
{
cout << "Win\n";
return 0;
}
for(int i = 0; i < n; i ++) cin >> a[i], e ^= a[i];
for(int i = 0; i < n; i ++)
{
if(e == a[i])
{
cout << "Win";
return 0;
}
}
cout << "Lose";
}