A 大吉大利 位运算

链接:https://ac.nowcoder.com/acm/contest/4853/A

题意:求出每一个数对数列中的任意一个数的位运算和

思路:把每一个数都按位存储计算即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e5+10;
 5 ll a[maxn];
 6 ll vis[40];
 7 ll sto[40];
 8 void init()
 9 {
10     sto[0]=1;
11     for(int i=1;i<=30;i++)
12         sto[i]=sto[i-1]*2;
13 }
14 int main()
15 {
16     init();
17     int n;
18     scanf("%d",&n);
19     for(int i=1;i<=n;i++){
20         scanf("%lld",&a[i]);
21         ll tmp=a[i];
22         for(int j=0;j<=30;j++){
23             if((a[i]>>j)&1){
24                 vis[j]++;
25                // printf("1 ");
26             }
27           //  else printf("0 ");
28         }
29       //  printf("\n");
30     }
31     ll ans=0;
32     for(int i=1;i<=n;i++){
33         ll tmp=a[i];
34         for(int j=0;j<=30;j++){
35             if((a[i]>>j)&1){
36                 ans+=vis[j]*sto[j];
37             }
38         }
39     }
40     printf("%lld\n",ans);
41     return 0;
42 }

 

posted @ 2020-05-19 10:30  古比  阅读(134)  评论(0编辑  收藏  举报