题意
O ( n ) O(n) O(n) 求 ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n ( x i & x j ) ⋅ ( x j ∣ x k ) \sum_{i=1}^n \sum_{j=1}^n \sum_{k=1}^n (x_i \, \& \, x_j) \cdot (x_j \, | \, x_k) ∑i=1n∑j=1n∑k=1n(xi&xj)⋅(xj∣xk)
思路
枚举 x j x_j xj, x i & x j x_i \, \& \, x_j xi&xj和 ( x j ∣ x k ) (x_j \, | \, x_k) (xj∣xk)都可以通过枚举 x j x_j xj的二进制每一位 O ( l o g a [ i ] ) O(loga[i]) O(loga[i])得到
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MXN = 1e6+5;
const int mod = 1e9+7;
LL a[MXN];
LL b[MXN];
int main(){
int CAS;cin>>CAS;
while(CAS--){
LL n;cin>>n;
LL sum=0;
for(int i=0;i<100;i++) b[i]=0;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),sum+=a[i],sum%=mod;
for(int i=1;i<=n;i++){
for(int j=0;j<61;j++){
if(a[i]&(1LL<<j)) b[j]++;
}
}
LL ans=0;
for(int i=1;i<=n;i++){
LL hou=(sum+a[i]%mod*n%mod)%mod;
for(int w=0;w<61;w++){
hou=hou-(a[i]&(1LL<<w))%mod*b[w]%mod;
hou%=mod;
}
for(int w=0;w<61;w++){
LL value=1LL<<w;
if( (a[i]&value)==0 )continue;
LL add=b[w]*(value%mod)%mod*hou%mod;
ans=ans+add;
ans%=mod;
}
}
ans+=mod;ans%=mod;
cout<<ans<<'\n';
}
return 0;
}