zoukankan      html  css  js  c++  java
  • 曹冲养猪(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;
    }
  • 相关阅读:
    MongoDB入门(1)--安装配置
    数据结构课程设计--平衡二叉树
    站立会议
    NABCD
    返回最大子数和(首位相连)
    返回一个数组中的最大子数组和
    最大数组BT
    最大数组
    时间记录日志
    四则运算的问题
  • 原文地址:https://www.cnblogs.com/Chri-K/p/13754167.html
Copyright © 2011-2022 走看看