#include <cstdio>
#include <cstring>
typedef long long LL;
const int N = 1e4 + 7, B = 1e8;
struct Int {
char sa[N];
LL a[N >> 2], len;
Int() {
memset(sa, 0, sizeof sa), memset(a, 0, sizeof a), len = 0;
}
void toInt() {
int i, j, t;
for (i = strlen(sa) - 1; i > 7; i -= 8, ++len)
for (j = i - 7; j <= i; ++j)
a[len] = a[len] * 10 + sa[j] - '0';
for (int j = 0; j <= i; ++j)
a[len] = a[len] * 10 + sa[j] - '0';
}
bool operator < (const Int &Ib) {
if (len < Ib.len)
return true;
if (len > Ib.len)
return false;
for (int i = len; ~i; --i) {
if (a[i] < Ib.a[i])
return true;
if (a[i] > Ib.a[i])
return false;
}
return false;
}
bool operator > (Int &Ib) {
return Ib < *this;
}
bool operator != (Int &Ib) {
return Ib < *this || *this < Ib;
}
bool isEven() {
return not(a[0] & 1);
}
void operator -= (const Int &Ib) {
for (int i = 0; i <= len; ++i)
a[i] -= Ib.a[i], (a[i] < 0 ? (a[i] += B, --a[i + 1]) : 0);
while (a[len] == 0 && len)
--len;
}
void Div2() {
for (LL i = len, m = 0; ~i; --i)
m = m * B + a[i], a[i] = m >> 1, m &= 1;
while (a[len] == 0 && len)
--len;
}
void operator *= (const int &b) {
for (int i = 0, end = len + 1; i <= end; ++i)
a[i] *= b, a[i + 1] += a[i] > B, a[i] %= B;
if (a[len + 1])
++len;
}
void operator *= (const Int &Ib) {
Int Ir;
for (int i = 0; i <= Ib.len; Ir.len = ++i)
for (int j = 0; j <= len; ++j, ++Ir.len)
Ir.a[Ir.len] += a[j] * Ib.a[i], Ir.a[Ir.len + 1] += Ir.a[Ir.len] / B, Ir.a[i] %= B;
while (Ir.a[Ir.len] == 0 && Ir.len)
--Ir.len;
*this = Ir;
}
void print() {
int i = len;
printf("%lld", a[i]);
for (--i; ~i; --i)
printf("%08lld", a[i]);
puts("");
}
} Ia, Ib, Ir;
int main() {
scanf("%s%s", Ia.sa, Ib.sa);
Ia.toInt(), Ib.toInt(), Ir.a[0] = 1;
while (Ia != Ib) {
if (Ia.isEven() && Ib.isEven())
Ia.Div2(), Ib.Div2(), Ir *= 2;
else if (Ia.isEven())
Ia.Div2();
else if (Ib.isEven())
Ib.Div2();
else if (Ia > Ib)
Ia -= Ib;
else
Ib -= Ia;
}
Ir *= Ia;
Ir.print();
return 0;
}