正题
题目链接:https://www.luogu.com.cn/problem/P6102?contestId=26472
题目大意
nnn个数的序列aaa,求
∑i=1n∑j=1n∑k=1n∑l=1n(aioraj)xor(akandal)\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\sum_{l=1}^n(a_i\ or\ a_j)\ xor\ (a_k\ and\ a_l)i=1∑nj=1∑nk=1∑nl=1∑n(ai or aj) xor (ak and al)
题目大意
每一位分开来求
考虑分开来求,若ororor为1,andandand为0,那么就是求至少有一个1的对数∗至少有一个是0的对数至少有一个1的对数*至少有一个是0的对数至少有一个1的对数∗至少有一个是0的对数
若ororor为0,andandand为1,那么就是求两个都是0的对数∗两个都是1的对数两个都是0的对数*两个都是1的对数两个都是0的对数∗两个都是1的对数
显然这些都很容易求,这里不再多讲
codecodecode
#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);
}