高精度模板
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int N = 1257, M = 1e8;
using LL = long long;
struct BigN {
LL a[N], len;
BigN() { len = 0; memset(a, 0, sizeof a); }
void init(string s) {
int i = s.size() - 8;
while (i >= 0)
a[++len] = stoi(s.substr(i, 8)), i -= 8;
if (i > -8)
a[++len] = stoi(s.substr(0, i+8));
}
BigN operator/ (const LL &x) {
LL r = 0;
BigN ans = *this;
for (int i = len; i; --i) {
ans.a[i] = (a[i] + r*M) / x;
r = (a[i] + r*M) % x;
}
while (ans.len>1 && !ans.a[ans.len]) --ans.len;
return ans;
}
BigN operator- (const BigN &B) {
// 此处默认结果为正
BigN ans = *this;
for (int i = 1; i <= len; ++i) {
ans.a[i] -= B.a[i];
if (ans.a[i] < 0) ans.a[i] += M, --ans.a[i+1];
}
while(ans.len>1 && !ans.a[ans.len]) --ans.len;
return ans;
}
BigN operator+ (const BigN &B) {
BigN ans = *this;
ans.len = max(ans.len, B.len) + 1;
for (int i = 1; i <= ans.len; ++i) {
ans.a[i] += B.a[i];
if (ans.a[i] >= M) ans.a[i] -= M, ++ans.a[i+1];
}
while(ans.len>1 && !ans.a[ans.len]) --ans.len;
return ans;
}
bool operator>= (const BigN &B) {
if (len != B.len) return len > B.len;
for (int i = len; i; --i)
if (a[i] != B.a[i]) return a[i] > B.a[i];
return true;
}
BigN operator* (const BigN &B) {
BigN ans;
ans.len = len + B.len;
for (int i = 1; i <= ans.len; ++i) ans.a[i] = 0;
for (int i = 1; i <= len; ++i)
for (int j = 1; j <= B.len; ++j) {
ans.a[i+j-1] += a[i] * B.a[j];
ans.a[i+j] += ans.a[i+j-1]/M;
ans.a[i+j-1] %= M;
}
while (ans.len>1 && !ans.a[ans.len]) --ans.len;
return ans;
}
BigN operator* (const int &x) {
BigN B;
B.init(to_string(x));
return *this * B;
}
bool even() { return !(a[1] & 1); }
void print() {
printf("%lld", a[len]);
for (int i = len-1; i; --i)
printf("%08lld", a[i]);
puts("");
}
} a, b, ans;
int main() {
string sa, sb;
cin >> sa >> sb;
a.init(sa), b.init(sb);
ans.init("1");
while (!(a>=b) || !(b>=a)) {
bool fa = a.even(), fb = b.even();
if (fa && fb) a = a/2, b = b/2, ans = ans*2;
else if (fa) a = a/2;
else if (fb) b = b/2;
else if (a >= b) a = a - b;
else b = b - a;
}
ans = ans * a;
ans.print();
return 0;
}