数据量太大了,不能暴力莽过,但是抑或运算每个二进制的值相对独立,对了,别用pow(),掉精度
#include<bits/stdc++.h> using namespace std; const int MAXN = 100000 + 10; int a[MAXN];long long mm = 1e9 + 7; long long quick(int p) { long long int ans = 1; long long int q = 2, t = p; while(p) { if(p & 1) //二进制下最后一位为1即为真,0即为否 ans = ans * q; q=q*q; p>>=1; } return ans; } int main() { int T,n; cin >> T; while(T -- ) { cin >> n; long long ans = 0; for(int i = 1; i <= n ; i ++) cin >> a[i]; for(int i = 1 ; i <= 31; i ++) { long long l = 0 , r = 0; for(int j = 1; j <= n ; j++) { if(a[j]&1) l ++; else r ++; a[j] >>= 1; } //cout << l << " " << r << " " <<pow(2,i) << endl; int t = quick(i); long long temp = l * r * t; temp %= mm; ans += temp; ans %= mm; } ans %= mm; cout << ans << endl; } return 0; }