题意:
题意就是给定一些数,求他们互相&的和
比如样例分析a1,a2,a3,a4,a5
ans=a1&a1+a1&a2+a1&a3+a1&a4+a1&a5+a2&a1+a2&a2+a2&a3+a2&a4+a2&a5+......+a5&a1+...+a5&a5
由于0&任何数=0,所以将a1,a2...an的每一位的1的总数用一个数组sum记录起来,然后将a1~an的每一位依次与sum的每一个相与的结果相加,即得到结果。
注意:
为了防止结果溢出,用1LL*结果。
ACcode:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int s[maxn];
int sum[250];
long long ann(int a)
{
long long ans=0;
long long now=0;
while(a)
{
if(a&1)
{
ans+=1LL*(1<<now)*sum[now];
}
now++;
a>>=1;
}
return ans;
}
int main()
{
int n;
cin >> n;
long long ans=0;
for(int i=0;i<n;i++)
{
cin >> s[i];
int cnt=0;
int m=s[i];
while(m)
{
if(m&1)
{
sum[cnt]++;
}
m/=2;
cnt++;
}
}
for(int i=0;i<n;i++)
{
ans+=ann(s[i]);
}
cout << ans;
}