正题
题目链接:https://www.luogu.com.cn/problem/P6102?contestId=26472
题目大意
个数的序列
,求
题目大意
每一位分开来求
考虑分开来求,若
为1,
为0,那么就是求
若
为0,
为1,那么就是求
显然这些都很容易求,这里不再多讲
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll XJQ=4294967296;
ll n,a[500100],ans;
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(ll i=0;i<32;i++){
ll one=0,o=0,A=0;
for(ll j=1;j<=n;j++){
if(a[j]&(1ll<<i)){
o=(o+j*2-2)%XJQ;
A=(A+one*2)%XJQ;
one++;
o++;A++;
}
else o=(o+one*2)%XJQ;
}
o%=XJQ;A%=XJQ;
ans=(ans+o*((n*n%XJQ-A+XJQ)%XJQ)%XJQ*(1ll<<i)%XJQ)%XJQ;
ans=(ans+A*((n*n%XJQ-o+XJQ)%XJQ)%XJQ*(1ll<<i)%XJQ)%XJQ;
}
printf("%lld",ans);
}