Codeforces Round #770 (Div. 2)


比赛链接:

https://codeforces.com/contest/1634

B. Fortune Telling

题目大意:

\(Alice\)\(Bob\) 玩游戏,\(Alice\) 有一个数 \(x\)\(Bob\) 有一个数 \(x + 3\),现有 \(n\) 个数字 \(a_1,a_2,...,a_n\),它们可以用自己的数从 1 开始一直到 \(n\),和 \(a_i\) 进行异或运算或者加法运算,某个人如果可以用自己的数得到 \(y\),那么这个人就赢了,现在知道他们俩中一定有个人获胜,问是谁。

思路:

可以知道加法和异或运算对数的奇偶性的改变是一致的,举个例子,对于加法运算来说,1 + 1 = 2,1 + 0 = 1,0 + 1 = 1,0 + 0 = 0,对于异或运算 1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0。
再加上两个人初始的数奇偶性不同,又有一个人一定会获胜,所以我们只需要 \(x\) 先和序列 \(a\) 中的所有数进行加法或者异或运算,得出来的数和 \(y\) 进行奇偶性比较,如果一样,那么 \(Alice\) 获胜,反之,\(Bob\) 获胜。

代码:

#include 
using namespace std;
#define LL long long
LL T, n, x, y, a;
void solve(){
	scanf("%lld%lld%lld", &n, &x, &y);
	for (int i = 0; i < n; ++ i)
		scanf("%lld", &a), x ^= a;
	if ((x + y) % 2 == 0) cout << "Alice\n";
	else cout << "Bob\n";
}
int main(){
	cin >> T;
	while (T--)
		solve();
	return 0;
}