高精 gcd,没压位,subtask#2 第一点 WA
#include <bits/stdc++.h>
using namespace std;
int a[10005], b[10005], ans[10005], la, lb, lans;
string sa, sb;
void mul(int *a) {
int res[10005] = {0};
for (int i = 1; i <= la; i++) {
for (int j = 1; j <= lans; j++) {
res[i + j - 1] += a[i] * ans[j];
}
}
lans = lans + la - 1;
for (int i = 1; i < lans; i++) {
res[i + 1] += res[i] / 10;
res[i] %= 10;
}
while (res[lans] >= 10) {
res[lans + 1] += res[lans] / 10;
res[lans++] %= 10;
}
memcpy(ans, res, sizeof(res));
}
bool gt(int *a, int *b) {
if (la != lb) return la < lb;
for (int i = la; i; i--) {
if (a[i] != b[i]) return a[i] < b[i];
}
return false;
}
void mul2() {
for (int i = 1; i <= lans; i++) {
ans[i] *= 2;
}
for (int i = 1; i <= lans; i++) {
if (a[i] > 10) ans[i] -= 10, ans[i + 1]++;
}
if (ans[lans + 1]) lans++;
}
void dev2(int *a, int &len) {
int num = 0;
for (int i = len; i; i--) {
num = num * 10 + a[i];
a[i] = num / 2;
num = (num & 1);
}
while (!a[len] && len) len--;
}
void gcd(int *a, int *b, int &la, int &lb) {
if (lb == 0) {
mul(a);
return;
}
bool flag = false;
if ((a[1] & 1) == 0 && (b[1] & 1) == 0) mul2();
if ((a[1] & 1) == 0) dev2(a, la), flag = true;
if ((b[1] & 1) == 0) dev2(b, lb), flag = false;
if (gt(a, b)) swap(a, b), swap(la, lb);
if (flag) return gcd(a, b, la, lb);
if (lb == 0) {
mul(a);
return;
}
for (int i = 1; i <= lb; i++) {
a[i] -= b[i];
}
for (int i = 1; i <= la; i++) {
if (a[i] < 0) {
a[i] += 10;
a[i + 1]--;
}
}
while (!a[la] && la) la--;
gcd(a, b, la, lb);
}
int main() {
freopen("data.txt", "r", stdin);
cin >> sa >> sb;
if (sa == sb) return cout << sa, 0;
la = sa.size(), lb = sb.size(), lans = 1;
ans[1] = 1;
for (int i = 0; i < la; i++) {
a[la - i] = sa[i] - '0';
}
for (int i = 0; i < lb; i++) {
b[lb - i] = sb[i] - '0';
}
gcd(a, b, la, lb);
while (!ans[lans] && lans) lans--;
for (int i = lans; i; i--) putchar(ans[i] + '0');
return 0;
}