LC.810. 黑板异或游戏(异或&数学)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC.810. 黑板异或游戏(异或&数学)相关的知识,希望对你有一定的参考价值。
LC.810. 黑板异或游戏(异或&数学)
题意
若当前玩家的局面为异或和为0的数组则胜。
分情况
-
1.开始所有数异或和为0,则先手赢。
-
1.开始所有数异或和不为0.
考虑一个问题,不论先手还是后手,他们选择数时数组的奇偶性都是一样的。
当 n n n为偶数,先手每次都是从偶数个数选择一个数然后变成奇数个交给后手。
假设 n n n为偶数,先手输了。
则必定存在一个局面先手无论选择那个数,剩下奇数个数异或和为0.
即: a 1 ⊕ a 2 ⊕ a 3 … a n = S ≠ 0 a_1\\oplus a_2\\oplus a_3\\dots a_n=S\\ne 0 a1⊕a2⊕a3…an=S=0
a 1 ⊕ a 2 … a i − 1 ⊕ a i + 1 ⊕ a i + 2 … a n = S i = S ⊕ a i = 0 a_1\\oplus a_2\\dots a_{i-1}\\oplus a_{i+1}\\oplus a_{i+2}\\dots a_n=S_i=S\\oplus a_i =0 a1⊕a2…ai−1⊕ai+1⊕ai+2…an=Si=S⊕ai=0
即 S 1 = S 2 ⋯ = S n = 0 S_1=S_2\\dots=S_n=0 S1=S2⋯=Sn=0
即 S 1 ⊕ S 2 ⋯ ⊕ S n S_1\\oplus S_2\\dots \\oplus S_n S1⊕S2⋯⊕Sn
= ( S ⊕ S … S ) ⊕ S =(S\\oplus S\\dots S)\\oplus S =(S⊕S…S)⊕S
= S ≠ 0 =S\\ne 0 =S=0,矛盾。
所以 n n n为偶数,先手必胜。
code
class Solution {
public:
bool xorGame(vector<int>& a) {
int s=0;
for(int x:a) s^=x;
return !s||(a.size()%2==0);
}
};
以上是关于LC.810. 黑板异或游戏(异或&数学)的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?
[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?
[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?