1 2 18467 6334
70239
//s[i]记录有多少个数的第i位上的数字是1
//flag[i][j]表示第i个数的第j位上的数字是0还是1
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1e4 + 5;
int a[N], s[20], flag[N][20];
int Pow(int x)
{
if(x == 0)
return 1;
int ans = 1;
for(int i = 1; i <= x; i++)
ans *= 2;
return ans;
}
int main()
{
int t, n, i, j;
scanf("%d",&t);
while(t--)
{
memset(s, 0, sizeof(s));
memset(flag, 0, sizeof(flag));
scanf("%d",&n);
int ans = 0;
for(i = 0; i < n; i++)
{
scanf("%d",&a[i]);
int k = a[i];
for(j = 0; j <= 16; j++)
{
int r = k % 2;
if(r == 1)
{
s[j]++;
flag[i][j] = 1;
}
k /= 2;
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j <= 16; j++)
{
if(flag[i][j] == 1)
ans += n * Pow(j);
else
ans += s[j] * Pow(j);
}
}
printf("%d\n",ans);
}
return 0;
}bnuoj 1065 简单的问题(位运算),布布扣,bubuko.com
原文:http://blog.csdn.net/lyhvoyage/article/details/21887583