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 a1a2a3an=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 a1a2ai1ai+1ai+2an=Si=Sai=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 S1S2Sn

    = ( S ⊕ S … S ) ⊕ S =(S\\oplus S\\dots S)\\oplus S =(SSS)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++ 原来是道数学推理题?

[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?

《LeetCode之每日一题》:37.黑板异或游戏

LeetCode每日一题——810. 黑板异或游戏(博弈问题)