WA0pts求调
查看原帖
WA0pts求调
743373
Vitamin_B楼主2023/11/19 12:51
# include <bits/stdc++.h>

# define ffor(i,name) \
	for (auto i = name.begin (); i != name.end (); ++ i)

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

string s1, s2;

int n, m, a[10005], b[10005], tmp[10005], ans[10005], len;

bool big_cmp () {

	if (n < m)
		return 0;

	if (n > m)
		return 1;

	for (int i = 0; i < n; ++ i) {

		if (a[i] < b[i])
			return 0;

		if (a[i] > b[i])
			return 1;

	}

	return 1;

}

void big_swap () {

	if (big_cmp ())
		return ;

	for (int i = 0; i < n; ++ i)
		tmp[i] = a[i];

	for (int i = 0; i < m; ++ i)
		a[i] = b[i];

	for (int i = 0; i < n; ++ i)
		b[i] = tmp[i];

	swap (n, m);

	return ;

}

void big_sub () {

	for (int i = 0; i < m; ++ i) {

		a[i] -= b[i];

		if (a[i] < 0)
			a[i] += 10, -- a[i + 1];

	}

	while (n && ! a[n - 1])
		-- n;

	return ;

}

void big_div (int& n, int a[]) {

	for (int i = n - 1; ~ i; -- i) {

		if (a[i] & 1)
			a[i - 1] += 10;

		a[i] /= 2;

	}

	while (n && ! a[n - 1])
		-- n;

	return ;

}

void big_mul () {
//	cout << "muling!\n";
	for (int i = 0; i < len; ++ i) {

		ans[i] *= 2;

		if (ans[i] > 9)
			ans[i] -= 10, ++ ans[i + 1];

	}

	if (ans[len])
		++ len;

	return ;

}

int main () {

	ios::sync_with_stdio (0);

	cin.tie (0);

	cout.tie (0);

	cin >> s1 >> s2;

	n = s1.size (), m = s2.size ();

	for (int i = 0; i < n; ++ i)
		a[n - i - 1] = s1[i] - '0';

	for (int i = 0; i < m; ++ i)
		b[m - i - 1] = s2[i] - '0';

	big_swap ();

	len = 1, ans[0] = 1;

	while (m) {

		if (a[0] & 1)
			if (b[0] & 1)
				big_sub ();
			else
				big_div (m, b);
		else if (b[0] & 1)
			big_div (n, a);
		else
			big_mul (), big_div (n, a), big_div (m, b);

		big_swap ();
//		cout << n << ' ' << m << '\n';
//		for (int i = 0; i < n; ++ i) cout << a[i] << ' ';
//		cout << '\n';
//		for (int j = 0; j < m; ++ j) cout << b[j] << ' ';
//		cout << '\n';
	}
//	for (int i = 0; i < len; ++ i) cout << ans[i];
//	cout << '\n';
//	for (int i = 0; i < n; ++ i) cout << a[i];
//	cout << '\n';
	memset (tmp, 0, sizeof tmp);

	for (int i = 0; i < n; ++ i)
		for (int j = 0; j < len; ++ j)
			tmp[i + j] += a[i] * ans[j];

	len += n - 1;
//	for (int i = len - 1; ~ i; -- i) cout << tmp[i];
//	cout << '\n';
	for (int i = 0; i < len; ++ i)
		tmp[i + 1] += tmp[i] / 10, tmp[i] %= 10;

	if (tmp[len])
		cout << tmp[len];

	while (len --)
		cout << tmp[len];

	return 0;

}
2023/11/19 12:51
加载中...