POJ-2891-Strange Way to Express Integers(线性同余方程组)

Posted ydddd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2891-Strange Way to Express Integers(线性同余方程组)相关的知识,希望对你有一定的参考价值。

链接:

https://vjudge.net/problem/POJ-2891

题意:

Elina is reading a book written by Rujia Liu, which introduces a strange way to express non-negative integers. The way is described as following:
Choose k different positive integers a1, a2, …, ak. For some non-negative m, divide it by every ai (1 ≤ i ≤ k) to find the remainder ri. If a1, a2, …, ak are properly chosen, m can be determined, then the pairs (ai, ri) can be used to express m.

“It is easy to calculate the pairs from m, ” said Elina. “But how can I find m from the pairs?”

Since Elina is new to programming, this problem is too difficult for her. Can you help her?

思路:

考虑同余方程组:
(x equiv a_1(mod m_1))
(x equiv a_2(mod m_2))
...
当求第i个式子时,我们有前i-i个方程的特解(x),通解(x+i*m),(m)为前i-1个方程(m)的lcm。
考虑第i个式子,(x+t*m equiv a_i (mod m_i)),解除最小的t即可。
上式可转为(t*m + (-k)*m_i = a_i-x),用扩展欧几里得即可得到最小解。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>

using namespace std;
typedef long long LL;
const int INF = 1e9;

const int MAXN = 1e5+10;
LL A[MAXN], M[MAXN];
int n;

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, x, y);
    LL tmp = x;
    x = y;
    y = tmp-(a/b)*y;
    return d;
}

LL ExCRT()
{
    LL res = A[1], m = M[1];
    for (int i = 2;i <= n;i++)
    {
        LL d, x, y;
        d = ExGcd(m,M[i], x, y);
        if ((A[i]-res)%d)
            return -1;
        x = x*(A[i]-res)/d;
        //cout << x << ' ' << y << ' ' << d << endl;
        x = (x%(M[i]/d)+(M[i]/d))%(M[i]/d);
        res = res+x*m;
        m = (m*M[i])/d;
        res %= m;
    }
    return (res%m+m)%m;
}

int main()
{
    while(~scanf("%d", &n))
    {
        for (int i = 1;i <= n;i++)
            scanf("%lld%lld", &M[i], &A[i]);
        printf("%lld
", ExCRT());
    }

    return 0;
}

以上是关于POJ-2891-Strange Way to Express Integers(线性同余方程组)的主要内容,如果未能解决你的问题,请参考以下文章

poj 2891 Strange Way to Express Integers 2012-09-05

POJ2891Strange Way to Express Integers(拓展CRT)

POJ2891Strange Way to Express Integers

poj 2891 Strange Way to Express Integers(中国剩余定理)

POJ-2891-Strange Way to Express Integers(线性同余方程组)

POJ2891:Strange Way to Express Integers——题解