社区讨论

gcd(ka,kb)=gcd(a,b)

P2152[SDOI2009] SuperGCD参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lxjusgky
此快照首次捕获于
2024/06/18 11:37
2 年前
此快照最后确认于
2024/06/18 11:47
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 0};
struct bigint {
	int num[10001], len;
	bigint() {
		memset(num, 0, sizeof num);
		len = 1;
	}
	bigint(string s) {
		memset(num, 0, sizeof num);
		int n = s.length();
		len = 0;
		for (int i = n - 1; i >= 0; i--)
			num[++len] = s[i] - '0';
		for (len = 10000; num[len] == 0 && len >= 2; --len);
	}
};
bigint mul(bigint a, int b) {
	bigint c("0");
	for (int i = 1; i <= a.len; i++) {
		c.num[i] += a.num[i] * b;
		c.num[i + 1] += c.num[i] / 10;
		c.num[i] %= 10;
	}
	for (c.len = 10000; c.num[c.len] == 0; c.len--);
	return c;
}
pair<bigint, int> div(bigint a, int b) {
	bigint c("0");
	int r = 0;
	for (int i = a.len; i >= 1; i--) {
		r = r * 10 + a.num[i];
		if (r >= b) {
			c.num[i] = r / b;
			r %= b;
		}
	}
	for (c.len = 10000; c.num[c.len] == 0; c.len--);
	return {c, r};
}
string a, b;
bigint A, B, C("1");
pair<bigint, int> u, v;
void update(int x) {
	while ((u = div(A, x)).second == 0)
		if ((v = div(B, x)).second == 0) {
			A = u.first;
			B = v.first;
			C = mul(C, x);
		} else A = u.first;
	while ((v = div(B, x)).second == 0)
		B = v.first;
}
int main() {
	cin >> a >> b;
	A = bigint(a);
	B = bigint(b);
	for (int i = 0; prime[i]; i++) {
		if (A.num[1] == 1 && A.len == 1) break;
		if (B.num[1] == 1 && B.len == 1) break;
		update(prime[i]);

	}
	for (int i = 10; i <= 185; i++) {
		if (A.num[1] == 1 && A.len == 1) break;
		if (B.num[1] == 1 && B.len == 1) break;
		update(i * 6 + 1);
		if (A.num[1] == 1 && A.len == 1) break;
		if (B.num[1] == 1 && B.len == 1) break;
		update(i * 6 + 5);
	}
	for (int i = C.len; i >= 1; i--)
		printf("%d", C.num[i]);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...