Link
A
我以为是一个贪心题。套路地,统计 \(f_i\) 表示第 \(i\) 位上 \(1\) 的个数,由于要求我们 \(\rm or\) 的值不能改变,也就是不能出现二进制下的退位和进位,以及当前位上 \(1\) 的个数必须 \(\geq 1\)。从这里出发思考对于 Alice 或者 Bob 当前的最优解?将偶数位尽可能消耗完,把奇数位留给对面,然后依次操作消耗到对方面临全部都为 \(1\) 的情况。这样讲比较抽象,具体地,可以从 \(111 \dots 111\) 的终止情况向前考虑。得到一个不严谨的结论但是感觉很对:如果 \(f_i \gt 0\) 且 \(f_{1 \leq i \leq n}\) 全为奇数,先手必败,反之先手必胜。但是看了一下 Editorial 发现这其实是 一种 Nim 博弈的变形,可以写的很快很干净。不会,记得补一下博弈论。
#include <bits/stdc++.h>using i64 = long long;constexpr int N = 30;void solve() {int n;std::cin >> n;std::vector<int> f(N);for (int i = 1, x; i <= n; i++) {std::cin >> x;for (int j = 0; j < N; j++) {if (x >> j & 1)f[j]++;}}for (int j = 0; j < 30; j++) {if (f[j] && !(f[j] & 1)) {std::cout << "Alice\n";return;}}std::cout << "Bob\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}