题目

源地址:

http://poj.org/problem?id=2891

理解

做的第一道关于扩展欧几里德方程的题目,还不够。

代码

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

using namespace std;

typedef long long int big;

big egcd(big a, big b, big &x, big &y )
{
    big t, ret;
    if (!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    ret = egcd(b, a % b, x, y);
    t = x, x = y, y = t - a / b * y;
    return ret;
}

int main()
{
    int k;
    big a1, r1, a2, r2;
    big d, x, y;
    while (scanf("%d", &k) != EOF)
    {
        bool flag = false;
        scanf("%I64d%I64d", &a1, &r1);
        for (int i = 2; i <= k; ++i)
        {
            scanf("%I64d%I64d", &a2, &r2);
            if (flag)    continue;
            d = egcd(a1, a2, x, y);
            if ((r2 - r1) % d)   flag = true;
            a2 = a2 / d;
            r1 = ((x * ((r2 - r1) / d) % a2 + a2) % a2) * a1 + r1;
            a1 = a2 * a1;
        }
        if (flag)    printf("-1\n");
        else    printf("%I64d\n", r1 % a1);

    }
    return 0;
}

更新日志

  • 2014年07月24日 已AC。