51nod2493

2493 二进制距离之和

  1. 2 秒
  2.  
  3. 262,144 KB
  4.  
  5. 20 分
  6.  
  7. 3 级题

小b有一个数组a,她想知道a中任意两个数之间二进制距离的总和。

两个整数的二进制距离指的是这两个数字的二进制数对应位不同的数量。

样例解释:

在二进制表示中,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.

 收起

输入

第一行输入一个正整数n,表示数组a的长度;
第二行输入a中元素,以空格隔开;
其中0<n≤10^4,a中任意元素a[i]满足0≤a[i]≤10^9

输出

输出一个数,表示二进制距离之和

输入样例

3
4 14 2

输出样例

6
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10005
#define ll long long
using namespace std;
int n;
int a[maxn];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        ll ans=0;
    for(int i=0;i<32;i++)
    {int cnt=0;
        for(int j=1;j<=n;j++)
            if(a[j]&(1<<i))
            cnt++;
            ans+=(n-cnt)*cnt;
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/89928191