Go to: My own blog
topic
Luogu P1495 Chinese Remainder Theorem (CRT)
answer
CRT requires all modulus to be mutually prime.
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=12;
int n;
ll M=1,x,y,ans;
ll a[maxn],m[maxn];
void exgcd(ll a,ll b)
{
if(!b) {x=1,y=0; return;}
exgcd(b,a%b);
ll z=x; x=y; y=z-(a/b)*y;
}
inline ll inv(ll a,ll b) {exgcd(a,b); return (x%b+b)%b;} //求逆元
inline ll CRT()
{
for(int i=1;i<=n;i++) M*=m[i];
for(int i=1;i<=n;i++)
{
ll Mi=M/m[i],ti=inv(Mi,m[i]);
ans=(ans+a[i]*Mi*ti%M)%M;
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&m[i],&a[i]);
printf("%lld\n",CRT());
return 0;
}