#include <bits/stdc++.h>
using namespace std;
long long bigmod(long long p, long long e, long long M) {
  long long ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return ret;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long modinverse(long long a, long long M) { return bigmod(a, M - 2, M); }
const int N = 50;
long long x, s, b;
bool get(long long x, int pos) { return x >> pos & 1; }
long long dp[N];
long long calc(int ind) {
  if (ind < 0) return 1;
  if (dp[ind] != -1) return dp[ind];
  long long ret = 0;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      if ((i & j) != get(b, ind)) continue;
      if ((i ^ j) != get(x, ind)) continue;
      ret += calc(ind - 1);
    }
  }
  return dp[ind] = ret;
}
int main() {
  cin >> s >> x;
  if ((s - x) & 1) {
    cout << 0 << endl;
    return 0;
  }
  b = (s - x) / 2;
  memset(dp, -1, sizeof(dp));
  cout << calc(49) - (b ? 0 : 2) << endl;
  return 0;
}

### Prompt

Develop a solution in Cpp to the problem described below:

Two positive integers a and b have a sum of s and a bitwise XOR of x. How many possible values are there for the ordered pair (a, b)?

Input

The first line of the input contains two integers s and x (2 ≤ s ≤ 1012, 0 ≤ x ≤ 1012), the sum and bitwise xor of the pair of positive integers, respectively.

Output

Print a single integer, the number of solutions to the given conditions. If no solutions exist, print 0.

Examples

Input

9 5


Output

4


Input

3 3


Output

2


Input

5 2


Output

0

Note

In the first sample, we have the following solutions: (2, 7), (3, 6), (6, 3), (7, 2).

In the second sample, the only solutions are (1, 2) and (2, 1).

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
long long bigmod(long long p, long long e, long long M) {
  long long ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % M;
    p = (p * p) % M;
  }
  return ret;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long modinverse(long long a, long long M) { return bigmod(a, M - 2, M); }
const int N = 50;
long long x, s, b;
bool get(long long x, int pos) { return x >> pos & 1; }
long long dp[N];
long long calc(int ind) {
  if (ind < 0) return 1;
  if (dp[ind] != -1) return dp[ind];
  long long ret = 0;
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      if ((i & j) != get(b, ind)) continue;
      if ((i ^ j) != get(x, ind)) continue;
      ret += calc(ind - 1);
    }
  }
  return dp[ind] = ret;
}
int main() {
  cin >> s >> x;
  if ((s - x) & 1) {
    cout << 0 << endl;
    return 0;
  }
  b = (s - x) / 2;
  memset(dp, -1, sizeof(dp));
  cout << calc(49) - (b ? 0 : 2) << endl;
  return 0;
}

```