24pts,可过样例,疑似爆longlong,请求快速乘调法。
查看原帖
24pts,可过样例,疑似爆longlong,请求快速乘调法。
706632
JiuLongYun楼主2023/4/30 22:11
#include<iostream>
#include<cstdio>

using namespace std;
long long ksc(long long a, long long b, long long p)
{
	if(b == 0) return 0;
	long long z = ksc(a, b / 2 , p);
	z = (z + z) % p;
	if(b % 2 != 0)
	{
		z = (z + a) % p;
	}
	return z;
}
long long Exgcd(long long a, long long b, long long &x, long long &y)
{
	if(b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	long long xp, yp;
	long long g = Exgcd(b, a%b, xp, yp);
	x = yp;
	y = xp - yp * (a / b);
	return g;
}
void EXCRT(long long p1, long long p2, long long a1, long long a2, long long &p, long long &a)
{
	long long k1, k2;
	long long g = Exgcd(p1, p2, k1, k2);
	k2 = -k2;
	long long h = (a2 - a1) / g;
	k1 = k1 * h;
	k2 = k2 * h;
	p = p1 / g * p2;
	long long x = ksc(k1, p1, p) + a1%p;
	a = (x % p + p) % p;
}
long long n;
long long a[111111], b[111111];
int main()
{
	cin >> n;
	long long i = 0;
	long long u = n;
	while(n--)
	{
		cin >> a[++i] >> b[i];
		b[i] = b[i] % a[i];
	}
	long long k, p;
	for(i = 2; i <= u; i++)
	{
		EXCRT(a[i], a[i-1], b[i], b[i-1], p, k);
		a[i] = p;
		b[i] = k;
	}
	cout << b[u];
	return 0;
}

2023/4/30 22:11
加载中...