rt,赛时调了 30 min 看不出来哪有问题。
思路是分每一位每个数进行前缀和,然后计算前缀和数组里奇偶性不同的数对的个数。
最后样例 #2 跟正确答案差 1,就很奇妙。
#include<iostream>
#define int long long
using namespace std;
int n,a[100005];
int sum[35][100005],ans,cnt;
int b[100005][35];
int mi[35];
int x,y,cnt1,cnt2;
signed main(){
cin>>n;
mi[0]=1;
for(int i=1;i<=30;i++){
mi[i]=mi[i-1]*2;
}
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
int x=a[i],tot=0;
while(x){
if(x%2)b[i][tot]+=x%2;
x/=2;
tot++;
}
}
for(int i=0;i<=30;i++){
x=0;y=0;
for(int j=1;j<=n;j++){
sum[i][j]=sum[i][j-1]+b[j][i];
sum[i][j]%=2;
if(sum[i][j]==1){
x++;
ans+=y*mi[i];
}
else y++,ans+=x*mi[i];
}
}
/*for(int i=0;i<=3;i++){
for(int j=1;j<=n;j++){
cout<<sum[i][j]<<' ';
}
cout<<endl;
}*/
cout<<ans<<endl;
return 0;
}