AcWing 223. 阿九大战朱最学
原题链接
简单
作者:
wangzi宸
,
2025-01-17 22:55:59
,
所有人可见
,
阅读 2
#include <iostream>
#include <vector>
// 定义 LL 为 long long 的别名
using LL = long long;
using namespace std;
vector<LL> a;
vector<LL> b;
// 扩展欧几里得算法
LL exgcd(LL a, LL b, LL &x, LL &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
// 中国剩余定理
LL CRT(int n, vector<LL> a, vector<LL> b) {
LL M = 1;
// 计算 M 的过程 -> M = a1 * a2 * a3 * …… * an
for (int i = 0; i < a.size(); i++) {
M *= a[i];
}
LL x = 0;
for (int i = 0; i < n; ++i) {
LL Mi = M / a[i];// 计算n个 Mi -> Mi = M/ai
LL Mi_ni, _;
// 求 Mi 在模 ai 下的逆元 Mi_ni,即找到 Mi_ni 使得 Mi*Mi_ni ≡ 1(mod ai)
LL d = exgcd(Mi, a[i], Mi_ni, _);
//Mi_ni = Mi_ni * 1 / d;
x += b[i] * Mi * Mi_ni;
}
return (x % M + M) % M; // 确保结果为非负
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
int a_, b_;
cin >> a_ >> b_;
a.push_back(a_);
b.push_back(b_);
}
cout << CRT(n, a, b) << endl;
return 0;
}