//b[i][0]:第i位出现了几个0 b[i][1]:第i位出现了几个1
//c[i]:2的i次方
//如果本身二进制是1,那么此位上有几个0就是几,再乘以2的此位
//如果本身二进制是0,那么此位上有几个1就是几,再乘以2的此位
//记得答案爆int,b[i][0]最大可以到100000,c[i]最大可以到2的31次方,相乘爆int
#include <bits/stdc++.h>
using namespace std;
long long tt = 1e9 + 7;
int a[100005];
long long int c[33];
long long int b[33][3];
void run(int x)
{
int l=1;
int T=31;
while(T--)
{
if(x%2==0)
b[l][0]++;
else
b[l][1]++;
x=x/2;
l++;
}
}
int main()
{
c[0]=1;
for(int i=1;i<=31;i++)
c[i]=c[i-1]*2;
int t;
scanf("%d",&t);
while(t--)
{
long long int ans=0;
memset(b,0,sizeof(b));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
run(a[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=31;j++)
{
if(a[i]%2==0)
ans=ans+b[j][1]*c[j-1];
else
ans=ans+b[j][0]*c[j-1];
a[i]=a[i]/2;
}
ans=ans%tt;
}
printf("%lld\n",ans);
}
return 0;
}
校oj2472 异或
最新推荐文章于 2021-12-12 08:29:16 发布