1. 程式人生 > 其它 >【CF】【位運算】【數學】C. XOR Equation

【CF】【位運算】【數學】C. XOR Equation

【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;
}