POJ2891——Strange Way to Express Integers(一元线性同余方程组)


由若干个一元线性同余方程组构成的方程组,叫做一元线同余方程组。

求解

我们可以将其统一划成a*x ≡ b(mod m)的形式,这样有利于算法的实现。

对于同于方程组的求解,其实质过程就是对于其中的同余方程依次进行两两合并,然后对最终合并的最终同余方程进行求解即可(如果在合并的过程中发现无解则不需要再隽星合并,因为此时该方程组已经无解)。先给出同余方程合并的推到过程,如图所示:

 

                                         ——转载





#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(!b){
        d=a;
        x=1;
        y=0;
    }
    else{
        exgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}

int main()
{
    LL i,n,a1,a2,r1,r2,ans,a,b,c,d,x0,y0;
    while(scanf("%lld",&n)!=EOF){
        bool ifhave=1;
        scanf("%lld%lld",&a1,&r1);
        for(i=1;i<n;i++){
            scanf("%lld%lld",&a2,&r2);
            a=a1,b=a2,c=r2-r1;
            exgcd(a,b,d,x0,y0);
            if(c%d){
                ifhave=0;
            }
            int t=b/d;
            x0=(x0*(c/d)%t+t)%t;//保证是最小的正整数
            r1=a1*x0+r1;
            a1=a1*(a2/d);
        }
        if(!ifhave){
            printf("-1\n");continue;
        }
        printf("%lld\n",r1);
    }
    return 0;
}


你可能感兴趣的:(POJ2891——Strange Way to Express Integers(一元线性同余方程组))