问题 F: 求和(位运算)

内存限制:128 MB 时间限制:1 S 标准输入输出
题目类型:传统 评测方式:文本比较 上传者:
提交:30 通过:11

题目描述

给出n 个整数,第i 个数字为Ai,每对数字之间有一个和谐度。每对数字的和谐度定义
为这两个数字的and(按位与,符号:&),or(按位或,符号:|),xor(按位异或,符号:^) 的和。而所有数的总和谐度是所有数对的和谐度的和。现在
你的任务是对于给定的n 个整数,求出它们的总和谐度。

输入格式

第一行一个整数n,表示有n 个整数。
第2 至n+1 行,每行有一个整数Ai,表示第i 个数。

输出格式

输出一行表示总和谐度。答案保证在2^63-1 以内。
【提示】:
可以分别求and的和,or的和,xor的和,最后相加。
比如and求按位与的和:
按位与的特点是相同比特位下两个必须为1,按位与(&)以后,这个比特位的结果才为1。
long long int有64个比特位,最前面一位是符号位,所以还剩63位(从右到左开始,从0开始标号),我们计算n个数每个比特位下1的和,假如标号为i位置的那个比特位有k个1,那么这个比特位所有数按位与以后的结果就是2^i*k*(k-1),因为这个比特位的权重为2的i次方,按位或必须都是1,那么就有k*(k-1)/2种选法。最后把每个比特位下的相加就是按位与的结果。
例如:
下面是二进制表示形式:
1:0 1
2:1 0
3:1 1
那么1&2+1&3+2&3=2^i*k1*(k1-1)/2+2^i*k2*(k2-1)/2=2^0*2*(2-1)/2+2^1*2*(2-1)/2.
第0位比特位有2个1,不管其他比特位,有2*(2-1)/2组按位与以后使第0位比特位为1,这一位的权重为2的i次方,所以最后第0位比特位的和为2^0*2*(2-1)/2。把63位比特位的结果相加,就是所以组按位与以后的结果。


同理按位或(只要一个为1,就是1),按位异或(相同为0,不同为1)也是如此。

输入样例 复制

3
1
2
3

输出样例 复制

18

数据范围与提示

【样例解释】
有三个数分别为1,2,3。
和谐度分别为:
(1,2),和谐度是(1 and 2) + (1 or 2) + (1 xor 2) = 6;
(1,3),和谐度为(1 and 3) + (1 or 3) + (1 xor 3) = 6;
(2,3),和谐度为(2 and 3) + (2 or 3) + (2 xor 3) = 6;
故总和谐度为18。
【数据范围及约定】
对于50%的数据,1<=n<=10000.
对于100%的数据,1<=n<=1000000,0<=Ai<=30000.

分类标签