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