AcWing 204. 不互素的中国剩余定理

题目链接:点击这里

在这里插入图片描述
不满足两两互质,只能每两个一组的求解。

最终答案的形式是 k a + x 0 ka+x_0 ,也就是 a a 的若干倍加上 x 0 x_0 ,也就是所有和 x 0 x_0 关于 a a 同余的数。所以最小正整数答案就是 x 0 x_0 a a 的正余数。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

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;
    scanf("%d", &n);
    
    bool flag = true;
    ll a1, m1;
    
    scanf("%lld%lld", &a1, &m1);
    
    for(int i = 0; i < n - 1; ++i)
    {
        ll a2, m2;
        scanf("%lld%lld", &a2, &m2);
        
        ll k1, k2;
        ll d = exgcd(a1, a2, k1, k2);
        
        if((m2 - m1) % d)
        {
            flag = false;
            break;
        }
        
        k1 *= (m2 - m1) / d;
        
        ll t = a2 / d;
        k1 = (k1 % t + t) % t;  //最小整数解
        
        m1 = a1 * k1 + m1;
        a1 = abs(a1 / d * a2);
    }
    
    if(flag)    printf("%lld\n", (m1 % a1 + a1) % a1);
    else    puts("-1");
    
    return 0;
}
发布了811 篇原创文章 · 获赞 127 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104804674
今日推荐