异或和之和 题解
bochibochi · · 题解
由异或操作可以想到拆位,对于数的每一位计算异或和。显然,如果第
某个区间异或和为
#include<iostream>
using namespace std;
int a[100005];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
long long ans = 0;
for(int k = 0; k <= 22; k++)
{
int x = 1, y = 0, s = 0;
long long res = 0;
for(int i = 0; i < n; i++)
{
if(a[i] & (1<<k)) s ^= 1;
if(s) res += x, y++;
else res += y, x++;
}
ans += res<<k;
}
cout << ans;
return 0;
}