求助
查看原帖
求助
469094
YZU20RXR楼主2021/7/1 11:12
#define ll long long int
#define M bi[i] - x * ai[i]
#define lcm ai[i] * ai[i + 1] / gcd
#include<iostream>
using namespace std;
ll n, k = 1, u0, ans, ai[50000], bi[50000];// gcd(a,b)==gcd(b,a%b)
inline ll QuickMul(ll a, ll b, ll m)
{
	ll c = a * b - (ll)((long double)a * b / m) * m;
	return c < 0 ? c + m : c;
}
ll exgcd(ll a, ll b, ll& x, ll& y)//x,y为c/gcd(x,y)
{
	if (b == 0) { x = 1, y = 0; return a; }//b==0时结束 此时ax+by=gcd(a,b),b==0,所以就是ax=a,那么x=1,y=0  然后递归反推
	ll gcd = exgcd(b, a % b, x, y);
	ll tmp = x;
	x = y, y = tmp - a / b * y;
	return gcd;
}
ll excrt() {//扩展中国剩余定理
	ll x, y, c, gcd;
	for (int i = 1; i < n; i++)
	{
		
		gcd = abs(exgcd(ai[i], ai[i + 1], x, y));//x y在此为特解

		c = bi[i] - bi[i + 1];

		x = QuickMul(x,c/gcd,ai[i]);
		//x *= ((bi[i] - bi[i + 1]) / gcd);
		ll M1 = M;
		while (M1 < 0) {
			M1 += lcm;
		}

		ans = (M1) % (lcm);
		bi[i + 1] = M1;
		ai[i + 1] = lcm;
	}
	return ans;
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> ai[i] >> bi[i];
	cout << excrt();
	return 0;
}
2021/7/1 11:12
加载中...