#include <bits/stdc++.h>
using namespace std;
bool SR(int &x) { return scanf("%d", &x) == 1; }
bool SR(long long &x) { return scanf("%lld", &x) == 1; }
bool SR(double &x) { return scanf("%lf", &x) == 1; }
bool SR(char *s) { return scanf("%s", s) == 1; }
bool RI() { return true; }
template <typename I, typename... T>
bool RI(I &x, T &...tail) {
  return SR(x) && RI(tail...);
}
void SP(const int x) { printf("%d", x); }
void SP(const long long x) { printf("%lld", x); }
void SP(const double x) { printf("%.16lf", x); }
void SP(const char *s) { printf("%s", s); }
void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I x, const T... tail) {
  SP(x);
  if (sizeof...(tail)) putchar(' ');
  PL(tail...);
}
const int maxn = 4e6 + 6;
struct Dsu {
  int par[maxn], clc;
  void init(int siz) {
    clc = siz;
    for (int i = 0; i < int(siz); i++) par[i] = i;
  }
  int find(int x) { return x == par[x] ? x : par[x] = find(par[x]); }
  void merge(int a, int b) {
    if (find(a) == find(b)) return;
    par[find(a)] = find(b);
    clc--;
  }
} dsu;
int n, m;
void read() { RI(n, m); }
void build() {
  int tot = n + m + n + m - 4;
  dsu.init(tot);
  int pt = 0;
  for (int i = 0; i < int(tot / 2); i++) {
    dsu.merge(i, pt--);
    if (pt < 0) pt += tot;
  }
  pt = n - 1;
  for (int i = (n - 1); i <= int(n - 1 + tot / 2 - 1); i++) {
    dsu.merge(i, pt--);
    if (pt < 0) pt += tot;
  }
}
void sol() { PL(dsu.clc); }
int main() {
  read();
  build();
  sol();
  return 0;
}
