中国剩余定理用于求解同余方程
公式
其中
为 模 下的逆元
//阿九大战朱最学
#include<iostream>
using namespace std;
typedef long long LL;
//扩展欧几里得求逆元
LL exgcd(LL a, LL b, int &x, int &y)
{
if (!b){x = 1, y = 0; return a;}
LL d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
//中国剩余定理
LL rct(LL *a, LL *m,int n)
{
LL ans = 0;
LL M = 1;
//m为除数的积
for (int i = 0; i < n; i++) M *= m[i];
for (int i = 0; i < n; i++)
{
int x , y;
LL mi = M / m[i];
exgcd(mi, m[i], x, y);
ans = (ans + a[i] * mi % M * x) % M;
}
//cout << M << endl;
return (ans + M) % M;
}
int main()
{
int n;
LL a[30], m[30];
cin >> n;
for (int i = 0; i < n; i++) cin >> m[i] >> a[i];
LL ans = rct(a, m, n);
cout << ans << endl;
return 0;
}