题目翻译

给出有 $n$ 个数的序列 $b$,还原序列 $a$,使 $a_i$ 为除 $b_i$ 以外所有数的异或和。
$2\leq n\leq 2\times 10^6,0\leq a_i\leq 10^9$。
$n\equiv0\pmod{2}$。

题目思路

前置知识:异或的归零律、恒等律与自反 $a\oplus a=0,a\oplus 0=a,a\oplus b\oplus a=b$。

观察题意可得我们求出的 $a_i$ 即为 $b_1\oplus b_2\oplus \dots \oplus b_n$ 再去除一个 $b_i$。

设 $b_1\oplus b_2\oplus \dots \oplus b_n=k$。

我们根据异或的自反可得:

$$
\begin{aligned}k\oplus b_i&=b_1\oplus b_2\oplus \dots \oplus b_n\oplus b_i\\&=b_1\oplus b_2\oplus\dots\oplus b_{i-1}\oplus b_{i+1}\oplus b_{i+2}\oplus \dots \oplus b_n\end{aligned}
$$

于是我们得到了想求的 $a$ 数组。

完整代码

代码

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[200020];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        k^=a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cout<<(k^a[i])<<" \n"[i==n];
    }
    return 0;
}

最后修改:2023 年 05 月 05 日
v我50吃疯狂星期四