大吉大利

链接: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;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值