#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int base = 1e18;
struct BigInt {
int num[1000]{}, len;
BigInt() { len = 0; }
void Assign(int x) {
len = 0;
while (x)num[++len] = x % base, x /= base;
}
BigInt operator-=(const BigInt &y) {
bool minus = false;
for (int i = 1; i <= len; i++) {
int tmp = num[i] - (i <= y.len ? y.num[i] : 0) - minus;
minus = false;
if (tmp < 0)tmp += base, minus = true;
num[i] = tmp;
}
while (len > 0 && num[len] == 0)len--;
return *this;
}
void Print() {
if (len == 0)printf("0");
else
for (int i = len; i >= 1; i--) {
if (i == len)printf("%lld", num[i]);
else printf("%018lld", num[i]);
}
}
};
BigInt operator-(const BigInt &x, const BigInt &y) {
BigInt ans;
bool minus = false;
for (int i = 1; i <= x.len; i++) {
int tmp = x.num[i] - (i <= y.len ? y.num[i] : 0) - minus;
minus = false;
if (tmp < 0)tmp += base, minus = true;
ans.num[++ans.len] = tmp;
}
while (ans.len > 0 && ans.num[ans.len] == 0)ans.len--;
return ans;
}
bool operator>(const BigInt &x, const BigInt &y) {
if (x.len > y.len)return true;
if (x.len < y.len)return false;
for (int i = x.len; i >= 1; i--) {
if (x.num[i] > y.num[i])return true;
if (x.num[i] < y.num[i])return false;
}
return false;
}
bool operator<(const BigInt &x, const BigInt &y) {
if (x.len < y.len)return true;
if (x.len > y.len)return false;
for (int i = x.len; i >= 1; i--) {
if (x.num[i] < y.num[i])return true;
if (x.num[i] > y.num[i])return false;
}
return false;
}
bool operator==(const BigInt &x, const BigInt &y) {
if (x.len != y.len)return false;
for (int i = x.len; i >= 1; i--)if (x.num[i] != y.num[i])return false;
return true;
}
bool operator!=(const BigInt &x, const BigInt &y) {
if (x.len != y.len)return true;
for (int i = x.len; i >= 1; i--)if (x.num[i] != y.num[i])return true;
return false;
}
BigInt Gcd(BigInt x, BigInt y) {
while (x != y) {
if (x > y)x -= y;
else y -= x;
}
return x;
}