CodeForces - 627A XOR Equation (異或性質)

題目大意:

        給你a + b和a xor b的值,問你滿足條件的(a, b)有多少個。

題解:

       首先要知道一個公式     a + b == a\ xor \ b + (a \& b) * 2

        由公式我們可以知道   \frac {s - x}{2}=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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章