解析:
我們Ci 可以化簡成
這種題通常就是套路題:
我們按位異或處理 求每一位的貢獻
統計前i個數二進制1和0出現的次數
假設當前是第i位,那麼貢獻就是 A的第i位1的個數 * B的第i爲0的個數+A的第i位0的個數 * B的第i位1的個數
最後乘上 2i;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
const int N=1e5+1000;
ll c[N],a[N],b[N];
ll cnta[N][2];
ll cntb[N][2];
int n;
int main()
{
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<=40;j++)
{
cnta[j][(a[i]>>j)&1]++;
cntb[j][(b[i]>>j)&1]++;
ll tmp=(cnta[j][0]*cntb[j][1]%MOD)+(cnta[j][1]*cntb[j][0]%MOD);
tmp%=MOD;
tmp=(tmp*(1ll<<j))%MOD;
c[i]=(c[i]+tmp)%MOD;
}
}
for(int i=1;i<=n;i++) cout<<c[i]<<" ";
cout<<endl;
}