原始问题要求计算如下表达式的值:
直接模拟上述过程需要两层嵌套循环,时间复杂度为 。鉴于
,平方级算法会导致超时(运算量可达
级别)。因此,必须在数学层面进行简化。
逻辑推导
让我们聚焦于内层循环计算的临时变量 :
其中 表示按位或(OR),
表示按位与(AND)。
利用布尔代数的 吸收律(Absorption Law):对于任意数值 和
,恒有
。
具体的推导逻辑如下:
-
子集性质:对于任意
,
的结果中的二进制位为
的位置,必然也是
中为
的位置。换句话说,
的二进制位总是
的子集。
-
自身包含性:循环变量
的取值范围是
到
,其中必然存在一次
的情况。此时该项为
。
-
最终值:
由于其中包括了项
,且其他所有项
经过“或”运算后都不会增加
中不存在的
位(它们被
“吸收”了)。 因此,我们可以得出结论:
结论 原问题等价于求数组中所有元素的异或和:
代码实现
#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;
}
}

京公网安备 11010502036488号