题目大意:给定长度为n的序列,计算
∑ni=1∑nj=i+1ai
^
aj
题解:此题较水,按位讨论01个数,乘起来计算贡献就好,记得开longlong
代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=' ';
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n;
int a[1000001];
ll sum;
ll cnt0,cnt1;
int main(){
freopen("alien.in","r",stdin);
freopen("alien.out","w",stdout);
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
for(int k=20;k>=0;--k){
cnt0=0;
cnt1=0;
for(int i=1;i<=n;++i){
if((a[i]>>k)&1)cnt1++;
else cnt0++;
}
sum+=(ll)(1<<k)*cnt0*cnt1;
}
cout<<sum;
return 0;
}