#include <bits/stdc++.h>
using namespace std;
char _buf[1 << 16];
int _p = 0, _l = 0;
void _readbuf() {
  cin.read(_buf, 1 << 16);
  _l = cin.gcount();
  _p = 0;
}
bool _eof() {
  if (_p < _l) return false;
  _readbuf();
  return _p == _l;
}
char _nextc() {
  if (_p < _l) return _buf[_p++];
  if (cin.eof()) throw 1;
  _readbuf();
  if (_p < _l) return _buf[_p++];
  throw 2;
}
string nexttoken() {
  string s = "";
  while (!_eof()) {
    char c = _nextc();
    if (c == ' ' || c == '\r' || c == '\n' || c == '\t') continue;
    s += c;
    while (!_eof()) {
      c = _nextc();
      if (c == ' ' || c == '\r' || c == '\n' || c == '\t') break;
      s += c;
    }
    break;
  }
  return s;
}
string nextline() {
  string s = "";
  while (!_eof()) {
    char c = _nextc();
    if (c == '\r' || c == '\n') continue;
    s += c;
    while (!_eof()) {
      c = _nextc();
      if (c == '\r' || c == '\n') break;
      s += c;
    }
    break;
  }
  return s;
}
int nextint() {
  string s = nexttoken();
  if (s == "") throw 3;
  bool minus = s[0] == '-';
  long long res = 0;
  for (size_t i = minus ? 1 : 0; i < s.length(); i++) {
    if (s[i] < '0' || s[i] > '9') throw 4;
    res = 10 * res + s[i] - '0';
  }
  if (minus) res = -res;
  if (res > 2147483647LL || res < -2147483648LL) throw 5;
  return (int)res;
}
long long nextlong() {
  string s = nexttoken();
  if (s == "") throw 3;
  bool minus = s[0] == '-';
  long long res = 0;
  for (size_t i = minus ? 1 : 0; i < s.length(); i++) {
    if (s[i] < '0' || s[i] > '9') throw 4;
    res = 10 * res + s[i] - '0';
  }
  if (minus) res = -res;
  return res;
}
double nextdouble() {
  string s = nexttoken();
  if (s == "") throw 5;
  double res = 0;
  bool minus = s[0] == '-';
  bool haveDigits = false;
  bool decimalSeparatorFound = false;
  size_t i;
  for (i = minus ? 1 : 0; i < s.length(); i++) {
    if (s[i] == '.' || s[i] == ',') {
      decimalSeparatorFound = true;
      ++i;
      break;
    }
    if (s[i] < '0' || s[i] > '9') throw 7;
    res = 10 * res + s[i] - '0';
    haveDigits = true;
  }
  if (decimalSeparatorFound) {
    long long p = 0, q = 1;
    int len = 0;
    for (; i < s.length(); i++) {
      if (s[i] < '0' || s[i] > '9') throw 8;
      haveDigits = true;
      if (++len < 17) {
        p = 10 * p + s[i] - '0';
        q *= 10LL;
      }
    }
    if (len > 0) {
      res += (double)p / q;
    }
  }
  if (!haveDigits) {
    throw 9;
  }
  return minus ? -res : res;
}
template <typename T>
void write(T x) {
  cout << x;
}
template <>
void write(double x) {
  cout << fixed << x;
}
template <typename T>
void writeln(T x) {
  write(x);
  cout << '\n';
}
long long s, x, dp[50][2][4];
int xorr[50], sum[50];
long long go(int pos, int carry, int positive) {
  if (pos == 40) {
    if (carry) return 0;
    if (positive == 3) return 1;
    return 0;
  }
  long long& res = dp[pos][carry][positive];
  if (res != -1) return res;
  res = 0;
  for (size_t i = 0; i < 2; i++) {
    for (size_t j = 0; j < 2; j++) {
      if ((i ^ j) == xorr[pos]) {
        int sums = i + j + carry;
        if ((sums & 1) == sum[pos]) {
          res += go(pos + 1, sums / 2, positive | i | (j * 2));
        }
      }
    }
  }
  return res;
}
void solve() {
  s = nextlong();
  x = nextlong();
  for (size_t i = 0; i < 50; i++) {
    for (size_t j = 0; j < 2; j++) {
      for (size_t k = 0; k < 4; k++) {
        dp[i][j][k] = -1;
      }
    }
  }
  long long ss = s, xx = x;
  for (size_t i = 0; i < 41; i++) {
    xorr[i] = xx & 1;
    sum[i] = ss & 1;
    ss /= 2;
    xx /= 2;
  }
  writeln(go(0, 0, 0));
}
int main() {
  cin.sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  solve();
  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;
char _buf[1 << 16];
int _p = 0, _l = 0;
void _readbuf() {
  cin.read(_buf, 1 << 16);
  _l = cin.gcount();
  _p = 0;
}
bool _eof() {
  if (_p < _l) return false;
  _readbuf();
  return _p == _l;
}
char _nextc() {
  if (_p < _l) return _buf[_p++];
  if (cin.eof()) throw 1;
  _readbuf();
  if (_p < _l) return _buf[_p++];
  throw 2;
}
string nexttoken() {
  string s = "";
  while (!_eof()) {
    char c = _nextc();
    if (c == ' ' || c == '\r' || c == '\n' || c == '\t') continue;
    s += c;
    while (!_eof()) {
      c = _nextc();
      if (c == ' ' || c == '\r' || c == '\n' || c == '\t') break;
      s += c;
    }
    break;
  }
  return s;
}
string nextline() {
  string s = "";
  while (!_eof()) {
    char c = _nextc();
    if (c == '\r' || c == '\n') continue;
    s += c;
    while (!_eof()) {
      c = _nextc();
      if (c == '\r' || c == '\n') break;
      s += c;
    }
    break;
  }
  return s;
}
int nextint() {
  string s = nexttoken();
  if (s == "") throw 3;
  bool minus = s[0] == '-';
  long long res = 0;
  for (size_t i = minus ? 1 : 0; i < s.length(); i++) {
    if (s[i] < '0' || s[i] > '9') throw 4;
    res = 10 * res + s[i] - '0';
  }
  if (minus) res = -res;
  if (res > 2147483647LL || res < -2147483648LL) throw 5;
  return (int)res;
}
long long nextlong() {
  string s = nexttoken();
  if (s == "") throw 3;
  bool minus = s[0] == '-';
  long long res = 0;
  for (size_t i = minus ? 1 : 0; i < s.length(); i++) {
    if (s[i] < '0' || s[i] > '9') throw 4;
    res = 10 * res + s[i] - '0';
  }
  if (minus) res = -res;
  return res;
}
double nextdouble() {
  string s = nexttoken();
  if (s == "") throw 5;
  double res = 0;
  bool minus = s[0] == '-';
  bool haveDigits = false;
  bool decimalSeparatorFound = false;
  size_t i;
  for (i = minus ? 1 : 0; i < s.length(); i++) {
    if (s[i] == '.' || s[i] == ',') {
      decimalSeparatorFound = true;
      ++i;
      break;
    }
    if (s[i] < '0' || s[i] > '9') throw 7;
    res = 10 * res + s[i] - '0';
    haveDigits = true;
  }
  if (decimalSeparatorFound) {
    long long p = 0, q = 1;
    int len = 0;
    for (; i < s.length(); i++) {
      if (s[i] < '0' || s[i] > '9') throw 8;
      haveDigits = true;
      if (++len < 17) {
        p = 10 * p + s[i] - '0';
        q *= 10LL;
      }
    }
    if (len > 0) {
      res += (double)p / q;
    }
  }
  if (!haveDigits) {
    throw 9;
  }
  return minus ? -res : res;
}
template <typename T>
void write(T x) {
  cout << x;
}
template <>
void write(double x) {
  cout << fixed << x;
}
template <typename T>
void writeln(T x) {
  write(x);
  cout << '\n';
}
long long s, x, dp[50][2][4];
int xorr[50], sum[50];
long long go(int pos, int carry, int positive) {
  if (pos == 40) {
    if (carry) return 0;
    if (positive == 3) return 1;
    return 0;
  }
  long long& res = dp[pos][carry][positive];
  if (res != -1) return res;
  res = 0;
  for (size_t i = 0; i < 2; i++) {
    for (size_t j = 0; j < 2; j++) {
      if ((i ^ j) == xorr[pos]) {
        int sums = i + j + carry;
        if ((sums & 1) == sum[pos]) {
          res += go(pos + 1, sums / 2, positive | i | (j * 2));
        }
      }
    }
  }
  return res;
}
void solve() {
  s = nextlong();
  x = nextlong();
  for (size_t i = 0; i < 50; i++) {
    for (size_t j = 0; j < 2; j++) {
      for (size_t k = 0; k < 4; k++) {
        dp[i][j][k] = -1;
      }
    }
  }
  long long ss = s, xx = x;
  for (size_t i = 0; i < 41; i++) {
    xorr[i] = xx & 1;
    sum[i] = ss & 1;
    ss /= 2;
    xx /= 2;
  }
  writeln(go(0, 0, 0));
}
int main() {
  cin.sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  solve();
  return 0;
}

```