#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
ll read(){
ll res=0;int op=1;char ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-')op=-op;ch=getchar();}
while('0'<=ch&&ch<='9'){res=res*10+ch-'0';ch=getchar();}
return res*op;
}
void write(ll x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
int sum[32][32],hig[N];//sum[i][j]:二进制下位数为i位且第j位为一的数的数量,hig[i]:第i个数二进制下的位数
int main(){
int T=read();
while(T--){
memset(sum,0,sizeof sum);
int n=read();
ll ans=0,tot=0;
for(int i=1;i<=n;i++){
ll x=read();
if(x==0){//特判
ans+=n;
tot++;
continue;
}
vector<int>cnt;
while(x){//拆位
cnt.push_back(x%2);
x/=2;
}
for(int j=0;j<cnt.size();j++)sum[cnt.size()][j+1]+=cnt[j];
hig[i]=cnt.size();
}
for(int i=1;i<=31;i++){//改成前缀和
for(int j=1;j<=i;j++){
sum[i][j]+=sum[i-1][j];
}
}
for(int i=1;i<=n-tot;i++){
ans+=sum[31][hig[i]]-sum[hig[i]][hig[i]];
}
// putchar(':');
write(ans);
putchar('\n');
}
return 0;
}
输入:
4
3 0 1 3
5
0 1 2 3 4
1
6
1
0
6
1 1 4 5 1 4
10
10 32 43 28 19 83 10 10 83 23
15
132 256 852 31 1 0 12 13 12 0 0 255 143 23 32
输出:
6
6
0
1
3
12
66
正确答案:
6
6
0
1
3
12
65