万绿从中一点红
查看原帖
万绿从中一点红
942161
Tomle楼主2024/4/21 11:20

高精 gcd,没压位,subtask#2 第一点 WA

record

#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;
}
2024/4/21 11:20
加载中...