题意:给定数组m[N]和r[N],求一个最小的正整数x满足x%m[i]=r[i](已知对于任意i, j保证mi, mj互质)
题解:模数互质的中国剩余定理模板题,下面的图文引用自该博客
设正整数两两互素,则同余方程组
有整数解。并且在模下的解是唯一的,解为
其中,而为模的逆元。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+4;
int n;
ll mod[N],res[N];
inline ll exgcd(ll a,ll b,ll &x,ll &y) {
if (!b) {
x=1,y=0;
return a;
}
ll x1,y1,d=exgcd(b,a%b,x1,y1);
x=y1,y=x1-(a/b)*y1;
return d;
}
inline ll inv(ll a,ll b) {
ll x,y,d=exgcd(a,b,x,y);
if (d^1) return -1;
return (x%b+b)%b;
}
inline ll crt(ll *m,ll *r) {
ll M=1,ret=0;
for (register int i=1;i<=n;++i) M*=m[i];
for (register int i=1;i<=n;++i) {
ll Mi=M/m[i];
ll t=inv(Mi,m[i]);
(ret+=r[i]*Mi%M*t%M)%=M;
}
return ret;
}
int main() {
scanf("%d",&n);
for (register int i=1;i<=n;++i) scanf("%d%d",&mod[i],&res[i]);
printf("%lld\n",crt(mod,res));
return 0;
}