几乎全RE
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cmath>
#define M1 1000000000LL
#define M2 9
using namespace std;
char s[999999];
struct bignum
{
long long num[1700] ;
int k;
bignum(){k=0;memset(num,0,sizeof(num)); }
void read()
{
scanf("%s" , s);
int len = strlen(s);
if(len%M2==0)k = len/M2;
else k = len/M2 + 1;
int n = 0 , m = 1;
long long t = 0;
int base = 1;
for(int i = len-1 ; i>= 0 ; i--)
{
t += (s[i]-'0')*base;
base *= 10;
n++;
if(n % 9 ==0 || n >= len)
{
num[m] = t;
t = 0LL;
base = 1;
m++;
}
}
}
void print()
{
printf("%lld" , num[k]);
for(int i = k-1 ; i >= 1 ; i--)
{
printf("%09lld" , num[i]);
}
}
void addfix()
{
for(int i = 1 ; i<k ; i++ )
{
num[i+1] += num[i]/M1;
num[i] %= M1;
}
while(num[k] >= M1)
{
num[k+1] += num[k]/M1;
num[k]%=M1;k++;
}
while(k > 0&&num[k] == 0)k--;
}
void minufix()
{
for(int i = 1 ; i < k ; i++ )
{
if(num[i] < 0)
{
num[i] += M1;
num[i+1] -= 1;
}
}
while(k > 0 && num[k] == 0) k--;
}
};
bool operator < (bignum a , bignum b)
{
if(a.k != b.k)return a.k<b.k ;
for(int i = a.k ; i>= 1 ; i--)
{
if(a.num[i] != b.num[i])
return a.num[i] < b.num[i];
}
return false;
}
bool operator >= (bignum a , bignum b)
{
if(a.k > b.k)
{
return true ;
}
else if(a.k < b.k)
{
return false ;
}
for(int i = a.k ; i>= 1 ; i--)
{
if(a.num[i] > b.num[i])
{
return true;
}
if(a.num[i] < b.num[i])
{
return false;
}
}
return true;
}
bool operator == (bignum a , bignum b)
{
if(a.k!=b.k)return false;
for(int i = a.k ; i>= 1 ; i-- )
{
if(a.num[i] != b.num[i])return false;
}
return true;
}
bool operator != (bignum a , long long b)
{
if(a.k>1||a.num[1]!=b) return true;
return false;
}
bignum operator - (bignum a , bignum b)
{
bignum reslt=a;
int len = min(a.k , b.k);
for(int i = 1 ; i<= len ; i++ )
{
reslt.num[i] -= b.num[i];
}
reslt.minufix();
return reslt;
}
bignum operator * (bignum a , bignum b)
{
bignum reslt;
reslt.k = a.k+b.k-1;
for(int i = 1 ; i<= a.k ; i++ )
{
for(int j = 1 ; j <= b.k ; j++)
{
reslt.num[i+j-1] += a.num[i]*b.num[j];
}
}
reslt.addfix();
return reslt;
}
bignum operator * (bignum a , long long b)
{
bignum reslt;
reslt.k = a.k;
for(int i = 1 ; i<= a.k ; i++ )
{
reslt.num[i] += a.num[i] * b;
}
reslt.addfix();
return reslt;
}
bignum operator / (bignum &a , long long b)
{
for(int i = a.k ; i >= 1 ; i-- )
{
a.num[i-1] += a.num[i]%b * M1;
a.num[i] /= b;
}
a.addfix();
return a;
}
bignum operator % (bignum a , bignum b)
{
if(a<b)return a;
int s = 1;
while(a.k > b.k)
{
b = b*M1;
s+=M2;
}
while(a.num[a.k] > b.num[b.k])
{
b = b*10LL;
s++;
}
while(s>0)
{
while(a>=b)
{
a = a-b ;
}
b = b/10LL;
s--;
}
return a;
}
bignum super_gcd(bignum a , bignum b)
{
bignum c;
while(b != 0LL)
{
c=a%b;
a=b;b=c;
}
return a;
}
bignum A , B;
int main()
{
A.read();
B.read();
super_gcd(A,B).print();
return 0;
}
/*
10000000000000000000000000000005 3
*/