社区讨论

萌新求助 EXCRT WA#14

P4777【模板】扩展中国剩余定理(EXCRT)参与者 4已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mi7x7nde
此快照首次捕获于
2025/11/21 05:05
4 个月前
此快照最后确认于
2025/11/21 05:05
4 个月前
查看原帖
CPP
#include <cstdio>

typedef long long ll;
typedef unsigned long long ull;
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))

inline ll read()
{
	char c = getchar();
	ll ret = 0, t = 1;
	while ((c < '0' || c > '9') && c != '-') c = getchar();
	if (c == '-') t = -1, c = getchar();
	while (c >= '0' && c <= '9') ret = ret * 10 + c - '0', c = getchar();
	return ret * t;
}

ll mul(ll a, ll b, ll p)
{
    ll l = a * (b >> 25LL) % p * (1LL << 25) % p, r = a * (b & ((1LL << 25) - 1)) % p;
    return (l + r) % p;
}

ll exgcd(ll a, ll b, ll& x, ll& y)
{
	if (b)
	{
		ll d = exgcd(b, a % b, y, x);
		y -= (a / b) * x; return d;
	}
	else { x = 1, y = 0; return a; }
}

ull gcd(ull a, ull b)
{
	if (b) return gcd(b, a % b);
	return a;
}
ull lcm(ull a, ull b)
{
	return a / gcd(a, b) * b;
}


ll EXCRT(int N, ll* A, ll* B)
{
	int i; ll X = A[1] % B[1], t, k; ull M = B[1];
	for (i = 2; i <= N; ++i)
	{
		ll gc = exgcd(M, B[i], k, t); t = ((A[i] - X) % B[i] + B[i]) % B[i], k = (k % B[i] + B[i]) % B[i];
		if (t % gc) return -1;
		k = mul(k, t / gc, B[i]), X = X + k * M, M = lcm(M, B[i]), X = (X % M + M) % M;
	}
	return X;
}

#define MAXN 100005
int N; ll a[MAXN], b[MAXN];

int main()
{
	N = read(); int i;
	for (i = 1; i <= N; ++i) b[i] = read(), a[i] = read();
	printf("%lld", EXCRT(N, a, b));
	return 0;
}
我好像输出了一个负数 看起来是 MMlcm\text{lcm} 的时候爆炸了 怎么改呢 qaq

回复

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

正在加载回复...