一本通1634:【例 4】曹冲养猪

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long 
#define M 22
#define mmp make_pair
using namespace std;
int read()
{
    int nm = 0, f = 1;
    char c = getchar();
    for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
    return nm * f;
}
 
ll gcd(ll a, ll b)
{
    return !b ? a : gcd(b, a % b);
}
 
ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if(!b)
    {
        x = 1, y = 0;
        return a;
    }
    else
    {
        ll d = exgcd(b, a % b, x, y);
        ll tmp = x;
        x = y;
        y = tmp - a / b * y;
        return d;
    }
}
 
ll inv(ll a, ll p)
{
    ll x, y;
    ll d = exgcd(a, p, x, y);
    if(d != 1) return -1;
    return (x % p + p) % p;
}
ll a[M], b[M], n; 
 
ll excrt()
{
    ll a1 = a[1], m1 = b[1], a2, m2;
    for(int i = 2; i <= n; i++)
    {
        a2 = a[i], m2 = b[i];
        ll c = a2 - a1, d = gcd(m1, m2);
        if(c % d) return -1;
        ll k = inv(m1 / d, m2 / d);
        m2 = m1 / d * m2;
        a1 = m1 * c / d % m2 * k + a1;
        m1 = m2;
        a1 = (a1 % m1 + m1) % m1;           
    }
    return a1;
}
 
int main()
{
    n = read();
    for(int i = 1; i <= n; i++) b[i] = read(), a[i] = read();
    cout << excrt() << "\n";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值