位运算
【考察点】位运算
&运算就要想到位运算,然后两个for循环。
需要把一个数拆分所有的二进制,
然后统计二进制位上的次数。
每次遇到的时候就直接+多少个即可。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; typedef long long ll ; const ll mod = 1e9+7; const int N = 1e6+10; const int M = 40 ; int n ; ll a[N] ; ll Bit[M]; int main() { scanf("%d",&n); for( int i = 1 ; i <= n ; i++ ){ scanf("%lld",&a[i]); for( int j = 0 ; j < M ; j++ ){ if( a[i] >> j & 1 ){ Bit[j] ++ ; } } } ll ans = 0 ; for( int i = 1 ; i <= n ;i++ ){ for( int j = 0 ; j < M ; j++ ){ if( a[i] >> j & 1 ){ ans = ( ans + (Bit[j] * (1<<j)) ) ; } } } printf("%lld\n",ans); return 0; }