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;
}
}
}