#include <bits/stdc++.h>
using namespace std;
int mi[] = {0, -1, 0, 1, -1, 1, 1, -1};
int mj[] = {1, 0, -1, 0, 1, 1, -1, -1};
int n1[50];
int n2[50];
long long dp[50][500][2][2];
bool memo[50][500][2][2];
int n;
long long solve(int i, int s, bool f1, bool f2) {
  if (i == n) return (s == 0 && f1 && f2);
  if (memo[i][s][f1][f2]) return dp[i][s][f1][f2];
  long long &ret = dp[i][s][f1][f2] = 0;
  for (int j = 0; j < 2; j++)
    for (int k = 0; k < 2; k++)
      if ((k + j + s) % 2 == n1[i] && (k ^ j) == n2[i])
        ret += solve(i + 1, (k + j + s) / 2, f1 || j, f2 || k);
  memo[i][s][f1][f2] = true;
  return ret;
}
void init() {
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
  return;
}
int main() {
  long long x, y;
  scanf("%lld %lld", &x, &y);
  int t1 = 0;
  int t2 = 0;
  while (x) {
    n1[t1++] = x % 2;
    x /= 2;
  }
  while (y) {
    n2[t2++] = y % 2;
    y /= 2;
  }
  n = max(t1, t2);
  printf("%lld\n", solve(0, 0, 0, 0));
  return 0;
}

### Prompt

In cpp, your task is to solve the following problem:

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;
int mi[] = {0, -1, 0, 1, -1, 1, 1, -1};
int mj[] = {1, 0, -1, 0, 1, 1, -1, -1};
int n1[50];
int n2[50];
long long dp[50][500][2][2];
bool memo[50][500][2][2];
int n;
long long solve(int i, int s, bool f1, bool f2) {
  if (i == n) return (s == 0 && f1 && f2);
  if (memo[i][s][f1][f2]) return dp[i][s][f1][f2];
  long long &ret = dp[i][s][f1][f2] = 0;
  for (int j = 0; j < 2; j++)
    for (int k = 0; k < 2; k++)
      if ((k + j + s) % 2 == n1[i] && (k ^ j) == n2[i])
        ret += solve(i + 1, (k + j + s) / 2, f1 || j, f2 || k);
  memo[i][s][f1][f2] = true;
  return ret;
}
void init() {
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
  return;
}
int main() {
  long long x, y;
  scanf("%lld %lld", &x, &y);
  int t1 = 0;
  int t2 = 0;
  while (x) {
    n1[t1++] = x % 2;
    x /= 2;
  }
  while (y) {
    n2[t2++] = y % 2;
    y /= 2;
  }
  n = max(t1, t2);
  printf("%lld\n", solve(0, 0, 0, 0));
  return 0;
}

```