对推导过程的一个小疑问
查看原帖
对推导过程的一个小疑问
298549
SIXIANG32楼主2022/7/19 19:55

如题这里是我的代码

#include <iostream>
#define int long long
#define MAXN 100000
#define QWQ cout << "qwq" << endl;
using namespace std;
int n;
int mul(int n, int m, int M) {
	int ans = 0, k = n;
	while(m) {
		if(m & 1) ans = (ans + k) % M;
		k = (k + k) % M, m >>= 1;
	}
	return ans;
}
int exgcd(int a, int b, int &x, int &y) {
	int ret, temp;
	if(!b) {
		x = 1, y = 0; 
		return a;
	}
	else {
		ret = exgcd(b, a % b, x, y);
		temp = x, x = y, y = temp - a / b * y;
		return ret;
	}
}
int a[MAXN + 10], m[MAXN + 10];
int excrt() {
	int A = a[1], M = m[1];
	for(int p = 2; p <= n; p++) {
		int P, Q, G = exgcd(M, m[p], P, Q), d = ((a[p] - A) % m[p] + m[p]) % m[p];//here awa
		if(d % G != 0) return -1;
		P = (mul(P, d / G, m[p] / G) + m[p] / G) % (m[p] / G); 
		A = M * P + A, M = M / G * m[p];
	} 
	return A;
}
signed main() {
	cin >> n;
	for(int p = 1; p <= n; p++)
		cin >> m[p] >> a[p];
	cout << excrt() << endl;
}

这里 ((a[p] - A) % m[p] + m[p]) % m[p] 不太懂为什么 (a[p]A)(a[p] - A) 可以这样做。我是这样推导的,布吉岛为什么可以这么干,可能是因为我太逊惹 qaq

2022/7/19 19:55
加载中...