Lang:G++
Edit12345678910111213141516171819202122232425262728#include <stdio.h>typedef long long ll;const int maxn=100005;int a[maxn];ll num[31][2];//num[i][0]存的是这n个数字的二进制表示中中第i个位为0的数字个数,num[i][1]存的是这n个数字的二进制表示中中第i个位为1的数字个数,void solve(){int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<31;i++) for(int j=0;j<2;j++) num[i][j]=0; //初始化for(int i=0;i<n;i++){for(int j=0;j<31;j++){if(a[i]&(1<<j)) num[j][1]++;//位运算判断第i个数字第j位是否为1else num[j][0]++;}}ll sum=0;for(int i=0;i<31;i++) sum+=num[i][0]*num[i][1]; // num[i][0]*num[i][1]不就是第i位上能使Hamming Distance值+1的所有组合数吗printf("%lld",sum);}int main(){solve();return 0;}