原始问题要求计算如下表达式的值:

直接模拟上述过程需要两层嵌套循环,时间复杂度为 。鉴于 ,平方级算法会导致超时(运算量可达 级别)。因此,必须在数学层面进行简化。

逻辑推导 让我们聚焦于内层循环计算的临时变量

其中 表示按位或(OR), 表示按位与(AND)。

利用布尔代数的 吸收律(Absorption Law):对于任意数值 ,恒有 。 具体的推导逻辑如下:

  1. 子集性质:对于任意 的结果中的二进制位为 的位置,必然也是 中为 的位置。换句话说, 的二进制位总是 的子集。

  2. 自身包含性:循环变量 的取值范围是 ,其中必然存在一次 的情况。此时该项为

  3. 最终值

    由于其中包括了项 ,且其他所有项 经过“或”运算后都不会增加 中不存在的 位(它们被 “吸收”了)。 因此,我们可以得出结论:

结论 原问题等价于求数组中所有元素的异或和

代码实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;

    while (T--) {
        int n;
        cin >> n;
        ll sum = 0LL;
        for (int i = 0; i < n; i++) {
            ll a;
            cin >> a;
            sum ^= a;
        }
        cout << sum << endl;
    }
}