求调 CRT 板子
查看原帖
求调 CRT 板子
713955
__er楼主2023/4/20 12:09
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace __gnu_cxx;
using namespace __gnu_pbds;
using namespace std;
int n, a[10001], m[10001];
int mul(int x, int y, int m) {
	int a = 0;
	y %= m;
	while (y > 0) {
		if (x & 1) a += y % m;
		x >>= 1, a <<= 1, a %= m;
	}
	return a % m;
}
void Exgcd(int a, int b, int &x, int &y) {
	if (b == 0) {
		x = 1, y = 0;
		return;
	}
	Exgcd(b, a % b, x, y);
	int z = x;
	x = y, y = z - y * (a / b);
	return;
}
int CRT(int n, int a[], int m[]) {
	int ans = 0, mod = 1;
	for (int i = 1; i <= n; i++) mod *= m[i];
	for (int i = 1; i <= n; i++) {
		int x, y, mi = mod / m[i];
		Exgcd(mi, m[i], x, y);
		x = (x % m[i] + m[i]) % m[i];
		ans += mul(mul(mi, x, mod), a[i], mod) % mod;
	}
	return (ans % mod + mod) % mod;
}
int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> m[i] >> a[i];
	}
	return cout << CRT(n, a, m), 0;
}
2023/4/20 12:09
加载中...