链接:https://ac.nowcoder.com/acm/contest/4853/A
来源:牛客网
题目描述
给定nnn个整数,依次为a1,a2,…,ana_1,a_2,…,a_na1,a2,…,an。
求∑i=1n∑j=1n(ai&aj)\sum_{i = 1}^n\sum_{j = 1}^n(a_i&a_j)∑i=1n∑j=1n(ai&aj)。“&&&”是二进制的与运算符。
输入描述:
第一行一个整数nnn.
第二行nnn个整数aia_iai.
输出描述:
一个整数表示上述求和式的答案.
示例1
输入
5
1 2 3 4 5
输出
33
备注:
1≤n≤1e51 \leq n \leq 1e51≤n≤1e5
0≤ai≤1e80 \leq a_i \leq 1e80≤ai≤1e8
用样例来说
1 —— 0 0 1
2 —— 0 1 0
3 —— 0 1 1
4 —— 1 0 0
5 —— 1 0 1
从左到右看,第一列有两个 1 ,4&4,4&5,5&5,5&4,所以,相当于有四个二进制的100,第二列有两个 1 ,2&2,3&3,2&3,3&2,相当于有四个二进制的010,第三列有三个 1 ,1&1,1&3,1&5,3&1,3&3,3&5,5&1,5&3,5&5,
所以规律大概就出来了,
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
long long aa[123];
int main()
{
int n;long long res=0;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
for(int j=0;x;j++)
{
if(x&1) aa[j]++;
x=x/2;
}
}
for(int i=0;i<32;i++)
//res+=aa[i]*aa[i]*pow(2,i);
res+=aa[i]*aa[i]*(1<<i);
cout<<res<<endl;
}