題目大意:
給你a + b和a xor b的值,問你滿足條件的(a, b)有多少個。
題解:
首先要知道一個公式
由公式我們可以知道
a&b肯定不會是負數或小數,所以當 s < x || (s - x)%2 != 0 時直接判無解。
本題就是在a^b 和 a&b 上做文章
對於每一位ai^bi和ai&bi,
當ai^bi==1時一定是ai=1,bi=0或ai=0,bi=1,那麼此時,ai&bi==0
當ai^bi==0時一定是ai=1,bi=1或ai=0,bi=0,那麼此時,按理說,ai&bi應該是等於1或0. 但是,ai&bi=(s-x)/2,是已經給出的,是確定的,所以在ai&bi==0的情況下,要麼是ai=1,bi=1,要麼是ai=0,bi=0,不是由我們可以選擇的,是由ai&bi決定的(即由給出的s和x決定了的)
也就是說,當ai^bi爲1的時候,a與b的對數組合就多了2種可能,並且,此時ai&bi也必須爲0,否則就是無解(這一點可以不用按位去算,直接拿出來,也就是說當ai^bi的某一位爲1的時候,ai&bi必爲0,那麼(a^b) & (a&b)必爲0)
坑點:當S==X時一定會產生解(0,S),(S,0),題目要求a,b是正數,所以這兩種情況不滿足題意,需要減去
易錯:在算結果的時候,是long long類型的,常數也要開long long
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll s,x,xx;
cin>>s>>x;
xx=x;
ll andd=(s-x)>>1;
if(s<x || (s-x)%2!=0 || (x&andd)!=0)
return puts("0"),0;
int bit=0;
while(x)
{
if(x&1)
++bit;
x>>=1;
}
ll ans=1ll<<bit;
if(s==xx)
ans-=2;
cout<<ans<<endl;
return 0;
}