题目:
思路:从二进制的角度,从0到30位每一位来判断求和,开一个新的数组统计第i位是0和1的个数,a[i]放到0~30位的每一位上,然后将a[i]在第位上为0数量乘以2的次方。
代码:照片:
可复制代码(没有注释):
#include<bits/stdc++.h>
using namespace std;
long long n,a[10000005],f[50][2];
int main(){
cin>>n;
for(int i = 1;i <= n;i++){
cin>>a[i];
for(int j = 0;j <= 30;j++)f[j][a[i]>>j&1]++;
}
long long sum;
for(int i = 1;i <= n;i++){
for(int j = 0;j <= 30; j++){
sum+=1ll*f[j][!(a[i]>>j&1)]*(1ll<<j);
}
}
cout<<sum;
return 0;
}