官方题解:
Ci=∑x=1…i∑y=1…iAx^By(这个好推)
看到二进制异或就可以想一下是否可以按位处理。
我们考虑异或运算会造成贡献的唯一可能就是当前位上的二进制数字不相同,那么对于每一位,贡献就是
A 第 j 位出现 1 的次数 * B 第 j 位出现 0 的次数 +
B 第 j 位出现 1 的次数*A 第 j 位出现 0 的次数。 (乘法原理)
最后按照这一位对总答案的贡献统计一下就可以了。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=40341872
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define LL long long
using namespace std;
const int maxn=2e5+10;
const LL mod=1e9+7;
LL a[maxn],b[maxn],c[maxn];
LL aa[32][2],bb[32][2];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&b[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=30;j++)
{
aa[j][(a[i]>>j)&1]++;
bb[j][(b[i]>>j)&1]++;
LL temp=(aa[j][1]*bb[j][0])%mod+(aa[j][0]*bb[j][1])%mod;
temp%=mod;
temp=(temp*(LL)(1<<j)%mod)%mod;
c[i]=(c[i]+temp)%mod;
}
printf("%lld%c",c[i],i==n?'
':' ');
}
return 0;
}