#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
  point() { x = y = 0; }
  point(double xx, double yy) {
    x = xx;
    y = yy;
  }
  point operator+(point p) { return point(x + p.x, y + p.y); }
  point operator-(point p) { return point(x - p.x, y - p.y); }
  point operator*(double a) { return point(x * a, y * a); }
  double operator*(point p) { return x * p.x + y * p.y; }
  double len2() { return (*this) * (*this); }
  double len() { return sqrt((*this).len2()); }
  bool operator==(point p) { return ((*this) - p).len() < 1e-7; }
};
long long s, x;
long long dp[100][2];
int main() {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(2);
  cin >> s >> x;
  long long kk = 0;
  if (x == s) kk = -2;
  dp[0][0] = 1;
  int i = 1;
  while (s != 0 || x != 0) {
    int ss = s & 1;
    int xx = x & 1;
    s = s >> 1;
    x = x >> 1;
    if (ss == 0 && xx == 0) dp[i][0] += dp[i - 1][0], dp[i][1] += dp[i - 1][0];
    if (ss == 0 && xx == 1) dp[i][1] += 2 * dp[i - 1][1];
    if (ss == 1 && xx == 0) dp[i][1] += dp[i - 1][1], dp[i][0] += dp[i - 1][1];
    if (ss == 1 && xx == 1) dp[i][0] += 2 * dp[i - 1][0];
    i++;
  }
  cout << dp[i - 1][0] + kk << endl;
  return 0;
}

### Prompt

Please create a solution in cpp to 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;
struct point {
  double x, y;
  point() { x = y = 0; }
  point(double xx, double yy) {
    x = xx;
    y = yy;
  }
  point operator+(point p) { return point(x + p.x, y + p.y); }
  point operator-(point p) { return point(x - p.x, y - p.y); }
  point operator*(double a) { return point(x * a, y * a); }
  double operator*(point p) { return x * p.x + y * p.y; }
  double len2() { return (*this) * (*this); }
  double len() { return sqrt((*this).len2()); }
  bool operator==(point p) { return ((*this) - p).len() < 1e-7; }
};
long long s, x;
long long dp[100][2];
int main() {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(2);
  cin >> s >> x;
  long long kk = 0;
  if (x == s) kk = -2;
  dp[0][0] = 1;
  int i = 1;
  while (s != 0 || x != 0) {
    int ss = s & 1;
    int xx = x & 1;
    s = s >> 1;
    x = x >> 1;
    if (ss == 0 && xx == 0) dp[i][0] += dp[i - 1][0], dp[i][1] += dp[i - 1][0];
    if (ss == 0 && xx == 1) dp[i][1] += 2 * dp[i - 1][1];
    if (ss == 1 && xx == 0) dp[i][1] += dp[i - 1][1], dp[i][0] += dp[i - 1][1];
    if (ss == 1 && xx == 1) dp[i][0] += 2 * dp[i - 1][0];
    i++;
  }
  cout << dp[i - 1][0] + kk << endl;
  return 0;
}

```