题意:s是a,b之和,x是a,b异或的值。求有多少个a,b对。(a,b为有序队列)
题解:a+b可分解为a^b[个位相加]和(a&b)*2[进位],即a+b=a^b+(a&b)*2.
然后进行2进制枚举。设s=(s-x)/2(即s=a&b).当x(即为a^b)=1时,s必为0,此时a,b有两种取值情况;当x=0时,s的取值决定了最终的a,b取值.具体看代码。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 1000100
#define MOD 1000000007
long long s,x;
int main()
{
int t;
while(scanf("%lld%lld",&s,&x) != EOF)
{
long long ans = 0;
s -= x;
if(s % 2 == 1)
{
printf("0\n");
continue;
}
s /= 2;
int flag = 0,cnt = 0;
if(!s)
cnt = 2;
for(int i = 0; i < 64; i++)
{
int a1 = s & 1;
int a2 = x & 1;
if(a1 == 1 && a2 == 1)
{
flag = 1;
break;
}
s >>= 1;
x >>= 1;
if(a2 == 0)
continue;
ans++;
}
if(flag)
printf("0\n");
else
printf("%lld\n",(1ll<<ans)-cnt);
}
return 0;
}