#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[10010];
struct BIGNUM{
int len,num[10010];
BIGNUM(){len=1;memset(num,0,sizeof(num));}
BIGNUM operator =(char *s){
len=strlen(s);
for(int i=0;i<len;i++)
num[i]=s[len-i-1]-'0';
return *this;
}
BIGNUM operator -(BIGNUM s1)const{
BIGNUM tmp;
tmp.len=len;
for(int i=0;i<len;i++)
{
tmp.num[i]+=num[i]-s1.num[i];
while(tmp.num[i]<0)
{
tmp.num[i]+=10;
tmp.num[i+1]--;
}
}
while(tmp.num[tmp.len-1]==0&&tmp.len>1)
tmp.len--;
return tmp;
}
void print()
{
for(int i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
}
bool operator ==(BIGNUM s1)const{
if(s1.len!=len)return false;
for(int i=0;i<len;i++)
if(num[i]!=s1.num[i])return false;
return true;
}
bool operator <(BIGNUM s1)const{
if(len>s1.len)return false;
if(len<s1.len)return true;
for(int i=len-1;i>=0;i--)
{
if(s1.num[i]!=num[i])return num[i]<s1.num[i];
}
return false;
}
void mul(){
for(int i=0;i<=len-1;i++)
{
num[i]*=2;
num[i+1]+=num[i]/10;
num[i]%=10;
}
len++;
while(num[len-1]==0&&len>1)len--;
}
void div(){
for(int i=len-1;i>=1;i--)
{
num[i-1]+=(num[i]%2)*10;
num[i]/=2;
}
num[0]/=2;
while(num[len-1]==0&&len>1)len--;
}
BIGNUM operator *(BIGNUM s1)const{
BIGNUM tmp;
tmp.len=len+s1.len;
for(int i=0;i<len;i++)
{
for(int j=0;j<s1.len;j++)
{
tmp.num[i+j]+=num[i]*s1.num[j];
tmp.num[i+j+1]+=tmp.num[i+j]/10;
tmp.num[i+j]%=10;
}
}
while(tmp.num[tmp.len-1]==0&&tmp.len>1)tmp.len--;
return tmp;
}
bool odd(){
return num[0]&1;
}
}a,b,ans;
int main()
{
cin>>s; a=s;
cin>>s; b=s;
ans.num[0]=1;
while(!(a==b))
{
if(!a.odd()&&!b.odd())
a.div(),b.div(),ans.mul();
else if(!a.odd())
a.div();
else if(!b.odd())
b.div();
else
if(a<b)
b=b-a;
else
a=a-b;
}
a=a*ans;
a.print();
return 0;
}