Atcoder Beginner Contest 147D(按位处理)
把每个数字每一位上二进制数字取出,求答案时直接用N个数里这一位是0的个数乘上这一位是1的个数然后乘上二的这一位次方,注意所有可能溢出的地方都要对mod取模。
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 long long a[300007]; 5 int num[300007][67]; 6 long long sum0[67],sum1[67],presolve[67]; 7 const long long mod = 1e9+7; 8 int main(){ 9 ios::sync_with_stdio(false); 10 cin.tie(NULL); 11 cout.tie(NULL); 12 int n; 13 cin>>n; 14 for(int i=1;i<=n;++i) 15 cin>>a[i]; 16 for(int i=1;i<=n;++i){ 17 long long temp=a[i]; 18 int cnt=0; 19 while(temp){ 20 if(temp&1) 21 num[i][cnt]=1; 22 ++cnt; 23 temp/=2; 24 } 25 } 26 long long ans=0; 27 for(int i=1;i<=n;++i){ 28 for(int k=0;k<=60;++k){ 29 if(num[i][k]==0) 30 ++sum0[k]; 31 else 32 ++sum1[k]; 33 } 34 } 35 long long x=1; 36 presolve[0]=1; 37 for(int i=1;i<=60;++i){ 38 x*=2; 39 presolve[i]=x; 40 } 41 for(int i=0;i<=60;++i){ 42 ans+=(((sum0[i]*sum1[i])%mod)*(presolve[i]%mod))%mod; 43 ans%=mod; 44 } 45 cout<<ans; 46 return 0; 47 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)