妹子,刚学扩展中国剩余定理,36pts求调,悬赏一关注
查看原帖
妹子,刚学扩展中国剩余定理,36pts求调,悬赏一关注
661641
Cx114514楼主2023/6/3 21:39
#include <bits/stdc++.h>
#define int __int128
using namespace std;

int read()
{
	int f = 1;
	char c = getchar();
	while (!isdigit(c))
	{
	    if (c == '-') f = -1;
	    c = getchar();
    }
	int x = 0;
	while (isdigit(c))
	{
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}

int buf[45];

void write(int x)
{
	int p = 0;
	if (x < 0)
	{
	    putchar('-');
	    x = -x;
	}
	if (x == 0) putchar('0');
	else
	{
		while (x)
		{
			buf[++p] = x % 10;
			x /= 10;
		}
		for (int i = p; i >= 1; i--)
			putchar('0' + buf[i]);
	}
}

int n, m[100005], p[100005];

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

signed main()
{
	n = read();
	for (int i = 1; i <= n; i++)
		p[i] = read(), m[i] = read();
	for (int i = 2; i <= n; i++)
	{
		int x, y;
		int g = exgcd(p[i - 1], p[i], x, y);
		x *= ((m[i] - m[i - 1]) / g);
		y *= ((m[i] - m[i - 1]) / g);
		p[i] = p[i - 1] * p[i] / g;
		m[i] = (m[i - 1] + p[i - 1] * x) % p[i]; 
	}
	write(m[n] % p[n]);
	putchar('\n');
    return 0;
}


2023/6/3 21:39
加载中...