刚学excrt挂84求dalao调试
查看原帖
刚学excrt挂84求dalao调试
544756
xiaobing楼主2024/8/21 15:20
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 1e6 + 10, inf = 1e9 + 10;
const ll INF = 1e18 + 10;
ll mqmul(ll x, ll y, ll mod) {
	if (y < 0)return mqmul(-x, -y, mod);
	if (y == 0)return 0;
	if (y == 1)return x % mod;
	ll rt = mqmul(x, y / 2, mod);
	rt += rt; rt %= mod;
	if (y % 2)rt += x, rt %= mod;
	return rt;
}
void exgcd(ll a, ll b, ll& x, ll& y) {
	if (b == 0) {
		x = 1, y = 0;
		return;
	}
	ll x0, y0;
	exgcd(b, a % b, x0, y0);
	x = y0;
	y = x0 - (a / b) * y0;
	return;
}
ll m[N], r[N];
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> m[i] >> r[i];
	for (int i = 1; i < n; i++) {
		ll a = m[i], b = -m[i + 1], c = r[i + 1] - r[i];
		ll x, y, d = __gcd(a, b);
		if (c % d) {
			cout << -1;
			return 0;
		}
		exgcd(a, b, x, y);
		x = c / d * x;
		ll p = a / d * b;
		if (p < 0)p = -p;
		r[i + 1] = ((((mqmul(a, x, p)) + r[i]) % p) + p) % p; m[i + 1] = p;
	}
	cout << r[n];
	return 0;
}
2024/8/21 15:20
加载中...