Rinne Loves Xor---------------------思維(按位前綴和+套路題)

在這裏插入圖片描述

在這裏插入圖片描述
解析:
我們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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章