题目描述:
小b有一个数组a,她想知道a中任意两个数之间二进制距离的总和。
两个整数的二进制距离指的是这两个数字的二进制数对应位不同的数量。
输入
第一行输入一个正整数n,表示数组a的长度; 第二行输入a中元素,以空格隔开; 其中0<n≤10^4,a中任意元素a[i]满足0≤a[i]≤10^9
输出
输出一个数,表示二进制距离之和
输入样例
3 4 14 2
输出样例
6
样例解释
在二进制表示中,4表示为0100,14表示为1110,2表示为0010。 4和14的距离为2,因为0100和1110只有右数第2,4位不同。其他同理。 所以答案为: Distance(4, 14) + Distance(4, 2) + Distance(14, 2) = 2 + 2 + 2 = 6.
题解:
如果用双重循环逐个比较2个数,那么需要循环 O(n2)O(n2) 次,每次比较可以暴力来做,也可以利用 xorxor 运算的特性,把问题转为求某个数的二进制表示有多少个 11 。这两种比较的方法,复杂度都是 O(log(n))O(log(n)) 的,因此总的复杂度为 O(n2logn)O(n2logn) 。
[思路2]
如何优化呢?
从另一个角度切入,考虑每一个二进制位上的数对答案的贡献,比如第一个二进制位上有 x 个 0 、 y个 1 ,那么不难计算,这个二进制位上