exCRT求调
查看原帖
exCRT求调
559502
TsH_GD楼主2024/5/11 22:21

rt,照着视频打的。。但是过不了样例

#include<bits/stdc++.h>

#define int long long

using namespace std;

const int N = 1e5 + 10;

int n;

int exgcd(int a,int b, int &x, int &y) {
	if(!b) {x = 1, y = 0; return a;}
	int X, Y;
	int d= exgcd(b, a % b, X, Y);
	X = Y;
	y = X - a / b * Y;
	return d;
}

int exCRT(int m[], int r[]){
	int m1, m2, r1, r2, p, q;
	m1 = m[1];
	r1 = r[1];
	for(int i = 2; i <= n ; i ++) {
		m2 = m[i];
		r2 = r[i];
		int d = exgcd(m1, m2, p, q);
		if((r2 - r1) % d) return -1;
		p = p * (r2 - r1) / d;
		p = (p % (m2 / d) + m2 / d) % (m2 / d);
		r1 = m1 * p + r1;
		m1 = m1 * m2 / d;
	}
	return (r1 % m1 + m1) % m1;
}

signed main(){
	cin >> n;
	int m[N];
	int r[N];
	for(int i = 1; i <= n; i ++) {
		cin >> m[i] >> r[i];
	}
	cout <<exCRT(m, r);
}
2024/5/11 22:21
加载中...