题目链接
#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
const int N=2e5+20;
int n;
int a[N];
long long ans;
int main()
{
int n; cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=0;i<=20;i++) //先枚举位
{
long long v0=0,v1=0;
for(int j=1;j<=n;j++) //再枚举ai,v*(n-j+1):贡献区间个数 ,1<<i:i位权值
{
if(a[j]>>i&1)
{
ans=ans+v0*(n-j+1)%M*(1<<i)%M;
ans%=M;
v1=(v1+j)%M; //a[j]的i位该位是1
}
else{
ans=ans+v1*(n-j+1)%M*(1<<i)%M;
ans%=M;
v0=(v0+j)%M; //a[j]的i位该位是0
}
}
}
//又因为一个区间需要两两异或运算,所以对于一对ai,aj需要算两次,故答案*2
cout<<ans*2%M;
}
原:D-小美的区间异或和_牛客周赛 Round 12 (nowcoder.com)