跳转至

中国剩余定理

#include<bits/stdc++.h>
#define Maxn 10
using namespace std;
typedef long long ll;
ll yu[Maxn+5],m[Maxn+5],s[Maxn+5];
ll exgcd(ll a,ll b,ll &x,ll &y)
{
    ll d=a;
    if(b==0)
    {
        x=1;
        y=0;
    }
    else
    {
        d=exgcd(b,a%b,x,y);
        x-=a/b*y;
        swap(x,y);
    }
    return d;
}
ll inv(ll a,ll b)
{
    ll x,y;
    ll d=exgcd(a,b,x,y);
    return (x%b+b)%b;
}
int main()
{
    int n;
    scanf("%d",&n);
    ll sum=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",m+i,yu+i);
        sum*=m[i];
    }
    for(int i=1;i<=n;i++) s[i]=inv(sum/m[i],m[i]);
    ll ans=0;
    for(int i=1;i<=n;i++) ans=(ans+(__int128)yu[i]*s[i]%sum*(sum/m[i]))%sum;
    printf("%lld\n",(ans%sum+sum)%sum);
    return 0;
}