CodeForces-1383B GameGame 思维,规律,博弈
CodeForces-1383B GameGame 思维,规律,博弈
题意
给定一个长度为\(n\) 的数组\(a\) ,两人轮流取数,取完后移除。
最终谁的异或和大谁就赢,若是平局则输出"DRAW"
分析
比较先入为主的思想就是一定要取最高位,最高位一旦确定为1了后面就不用比了。
设\(x\) 为当前最高位为\(1\) 的数的个数,若\(x\) 为偶数,显然这一位的最终结果是\(0\) ,接下去比较下一位
若\(x\) 是奇数,是否就一定先手必胜呢?
其实未必,有已下结论
- 若\(x \quad mod \quad 4 = 3\)
-
- 若 $y \quad mod \quad 2 = 0 $ ,后手必胜,先手不管取什么,后手只需要模仿先手的策略,就能最终得到奇数个\(1\)
- 若 $y \quad mod \quad 2 = 1 $ ,先手必胜,先手只需取一个\(0\) ,就可以把局面转化成上一个局面
- 若\(x \quad mod \quad 4 = 1\) 先手必胜,先手只需取一个\(1\) ,由于剩下的\(1\) 是\(4\) 的倍数,先手只需模仿后手的策略即可
代码
int a[100005];
int main() {
int T = readint();
while (T--) {
int x = 0;
int n = readint();
for (int i = 0; i < n; i++) a[i] = readint(), x ^= a[i];
if (!x) {
puts("DRAW");
continue;
}
for(int k = 30;k >= 0;k--)
if (x >> k & 1) {
vector<int> f(2);
for (int i = 0; i < n; i++) f[a[i] >> k & 1]++;
if (f[1] % 4 == 3 && f[0] % 2 == 0) puts("LOSE");
else puts("WIN");
break;
}
}
}