【CF】【位運算】【數學】C. XOR Equation
阿新 • • 發佈:2022-03-05
【CF】【位運算】【數學】C. XOR Equation
問題描述
\(a+b=m\),a xor b = n , 求點對(a,b)的個數
異或運算相當於是一種模2的加法運算,即在某位上,a和b同時為1時,是不將進位的效果納入考慮的。
因而有公式,\(a+b = a\space xor\space b + (a \& b)\times 2\)
於是我們可以得到a與上b的結果,進而,若a與上b的結果在某一位上為1的話,那麼就說明a和b在這個位置上的數字都為1。
進一步地,我們對a xor b 上的每一個位置進行考慮
若a xor b 在這個位置上的結果為1的話,則說明a和b兩者之間其中有一者在這個位置上為1,另一者在這個位置上為0。而它們與起來的結果就為0。所以若與起來的結果不為0的話,則說明矛盾,此時應該直接輸出0。
若a xor b在這個位置上的結果為0的話,則說明 a = b,且 a & a = a,所以a = b = a & b,此時答案也是固定的。
所以答案為2的a xor b中1的個數的次數方(又由於a!=0,b!=0,此時應該進行特判,而出現0的情況,只有每一位位置上要麼滿足\(a_i\space xor\space b_i = 1\),或者滿足當a_i xor b_i = 0時,\(a_i = b_i = 0\),總的來說\(a \& b = 0\) ,即\(a + b = a\space xor\space b\))
#include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define MAX 1000005 #define MOD 1000000007 using namespace std; const int N = 3E5+5,M = 6E5+10; ll sum,xorn; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>sum>>xorn; if((sum-xorn)%2) return puts("0"); ll p = (sum-xorn)/2; ll ans = 1; for(int i=45;i>=0;i--) { int pxor = (xorn>>i) & 1; int pp = (p>>i) & 1; if(pxor==1) { if(pp==1) return puts("0"); else ans *= 2; } } if(sum==xorn) ans -= 2; cout<<ans; return 0; }