中国剩余定理

六月ゝ 毕业季﹏ 提交于 2020-02-27 08:37:16

题目链接——表达整数的奇怪方式 

#include <iostream>
#include <cstdio>
using namespace std;

int line;
typedef long long LL;
LL exgcd(LL a, LL b, LL & x, LL & y)
{
    if(b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    LL d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

inline LL mod(LL a, LL b)
{
    return (a % b + b) % b;
}

int main()
{
    cin >> line;
    LL a1, m1, k1;
    scanf("%lld%lld", &a1, &m1);
    bool flag = true;
    
    LL a2, m2, k2;
    for (int i = 1; i < line; i ++)
    {
        scanf("%lld%lld", &a2, &m2);
        
        LL d = exgcd(a1, -a2, k1, k2);
        if((m2 - m1) % d)
        {
            flag = false;
            continue;
        }
        k1 *= (m2 - m1) / d;
        m1 = mod(k1, a2 / d) * a1 + m1;
        a1 = abs(a1 / d * a2);
    }
    
    if(flag) printf("%lld\n", mod(m1, a1));
    else puts("-1");
    
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!