首先可以知道对于和,与操作,他不会改变两个数字的二进制中1的总个数
比如
第一位 | 1 | 0 | 0 |
---|---|---|---|
第二位 | 1 | 1 | 0 |
和操作 | 1 | 0 | 0 |
与操作 | 1 | 1 | 0 |
可以发现不会改变1的总个数,那么就进行贪心操作,把1进行分配即可
int a[N], b[30];
void solve(int kase){
int n; scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= 20; j++) {
b[j] += a[i] & 1;
a[i] >>= 1;
}
}
ll ans = 0;
for(int i = 1; i <= n; i++) {
ll now = 0;
for(int j = 0; j <= 20; j++) {
if(b[j]) {
now += 1 << j;
b[j]--;
}
}
ans += now * now;
}
printf("%lld
", ans);
}