曹冲养猪(crt)

//中国剩余定理

//我的70分代码=_=

#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    ll d = exgcd(b,a % b,y,x);
    y -= a / b * x;
    return d;
}
int main()
{
    int n;
    cin >> n;
    ll x = 0,m1,a1;
    cin >> m1 >> a1;
    for(int i = 0;i < n - 1;i ++)
    {
        ll m2,a2;
        cin >> m2 >> a2;
        ll k1,k2;
        ll d = exgcd(m1,-m2,k1,k2);
        if((a2 - a1) % d)
        {
            x = -1;
            break;
        }
        k1 *= (a2 - a1) / d;
        k1 = (k1 % (m2 / d) + m2 / d) % (m2 / d);
        x = k1 * m1 + a1;
        ll m = abs(m1 / d * m2);
        a1 = k1 * m1 + a1;
        m1 = m;
    }
    if(x != -1)
    {
        x = (x % m1 + m1) % m1;
    }
    cout<<x<<endl;
    return 0;
}

//std100分代码

#include<iostream>
#include<cstdio>
#define N 5050
using namespace std;
typedef long long LL;
LL m[N];
LL M=1,n,ans;
LL t[N],Mn[N],MM[N];
LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    else
    {
        LL t=exgcd(b,a%b,y,x);
        y-=x*(a/b);
        return t;
    }
}
LL CRT()
{
    LL temp;
    for(LL i=1;i<=n;i++)
    {
        MM[i]=M/m[i];
        LL k=exgcd(MM[i],m[i],Mn[i],temp);
        ans+=(MM[i]*Mn[i]*t[i]);
    }
    return ((ans%M)+M)%M;
}
int main()
{
    cin>>n;
    for(LL i=1;i<=n;i++)
    {
        scanf("%d%d",&m[i],&t[i]);
        M*=m[i];
    }
    cout<<CRT()<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Chri-K/p/13754167.html