1. 程式人生 > >牛客小白月賽11 Rinne Loves Xor(異或運算好題)

牛客小白月賽11 Rinne Loves Xor(異或運算好題)

tdi 當前 -s html lov sin 分享 bubuko ive

Rinne Loves Xor

技術分享圖片

題解:

  看到二進制異或就可以想一下是否可以按位處理。我們可以通過計算二進制中每一位對答案貢獻來解這個題。我們考慮異或運算會造成貢獻的唯一可能就是當前位上的二進制數字不相同,那麽對於每一位,貢獻就是 A 第 j 位出現 1 的次數 × B 第 j 位出現 0 的次數 + B 第 j 位出現 1 的次數 ×A 第 j 位出現 0 的次數。 (乘法原理)最後按照這一位對總答案的貢獻統計一下就可以了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4
#include<algorithm> 5 using namespace std; 6 typedef long long ll; 7 const int maxn=1e5+10; 8 const ll mod=1e9+7; 9 ll x[32][2],y[32][2];//x[i][0]表示的是a[i]數組中第i位是0的個數 x[i][1]表示的是a[i]數組中第i位是1的個數 y數組同理 10 ll a[maxn],b[maxn]; 11 ll ans[maxn]; 12 int n; 13 int main() 14 { 15 cin>>n; 16 for
(int i=1;i<=n;i++) 17 scanf("%lld",&a[i]); 18 for(int i=1;i<=n;i++) 19 scanf("%lld",&b[i]); 20 for(int i=1;i<=n;i++) 21 { 22 ans[i]=ans[i-1]+(a[i]^b[i]); 23 ans[i]%=mod; 24 for(int j=0;j<32;j++) 25 { 26 ans[i]+=(x[j][!(b[i]>>j&1
)]+y[j][!(a[i]>>j&1)])<<j;//因為只有兩個數的某一位不同時會對結果有所貢獻,所以遍歷每一位,所以對於a[i]的第j位,需要尋找b[i]的第j位和a[i]第j位不相同的才可以,對於b[i]也一樣。 27 ans[i]%=mod; 28 x[j][a[i]>>j&1]++; 29 y[j][b[i]>>j&1]++; 30 } 31 printf("%lld ",ans[i]); 32 } 33 }

牛客小白月賽11 Rinne Loves Xor(異或運算好題)