#include <bits/stdc++.h>
using namespace std;
int ri() {
  int x;
  if (scanf(" %d", &x) == EOF) return -1;
  return x;
}
long long int rl() {
  long long int x;
  if (cin >> x) return x;
  return -1;
}
string rs() {
  string s;
  if (cin >> s) return s;
  return "";
}
struct SingleCase {
  long long int a, b;
  bool solveCase() {
    a = ri();
    if (a < 0) return false;
    b = ri();
    long long int n = a + b;
    long long int ret = 0;
    long long int count = 1;
    for (long long int period = 1; period <= n; count++) {
      long long int reps = n / period;
      long long int maxPeriod = min(n / reps, n);
      long long int k = reps;
      long long int lox = (a + k) / (k + 1), hix = a / k;
      long long int loy = (b + k) / (k + 1), hiy = b / k;
      if (lox <= hix && loy <= hiy) {
        long long int lo = lox + loy, hi = hix + hiy;
        ret += intersect(lo, hi, period, maxPeriod);
      }
      period = maxPeriod + 1;
    }
    cout << ret << endl;
    return true;
  }
  long long int intersect(long long int a, long long int b, long long int x,
                          long long int y) {
    long long int p = max(a, x), q = min(b, y);
    if (q >= p) return q - p + 1;
    return 0;
  }
};
int main() {
  while (SingleCase().solveCase()) {
  };
  return 0;
}
