已知a+b=S.a^b=X;
让你找所有满足条件的(a,b);
要求a,b都是正整数。
思路:
1、通过简单分析,我们可以根据s的二进制和x的二进制来讨论分析出来一些东西:
对应x的二进制值,如果按位扫,对应有1的地方,结果就乘2.
如果s==x,结果再去掉(0,x)以及(x,0)的情况即可。
2、那么这个题的难点在于什么情况会是0.
通过百度题解补题了解到:a+b=a^b+(a&b)*2;
那么有:(a&b)=(s-x)/2;
显然,如果s<x,或者(s-x)是奇数的情况,肯定是不允许有(a&b)的结果的,所以这种情况就是无解。
另外,如果有(a&b)&x!=0,也是不可能存在的情况,那么这种情况也是无解。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
int main()
{
ll s,x;
while(~scanf("%I64d%I64d",&s,&x))
{
ll tmp=x;
if(s<x||(s-x)%2==1)
{
printf("0\n");
continue;
}
ll And=(s-x)/2;
if((And&x)!=0)
{
printf("0\n");
continue;
}
ll cnt=1;
while(x)
{
if((x&1)!=0)cnt*=2;
x/=2;
}
ll ans=cnt;
if(tmp==s)ans-=2;
printf("%I64d\n",ans);
}
}