POJ2891 - Strange Way to Express Integers(模线性方程组)

题目大意

求最小整数x,满足x≡a[i](mod m[i])(没有保证所有m[i]两两互质)

题解

中国剩余定理显然不行。。。。只能用方程组两两合并的方法求出最终的解,刘汝佳黑书P230有讲~~具体证明和实现我是参考此大神的

代码:

#include<iostream>

using namespace std;

#define MAXN 100000

typedef long long LL;

LL m[MAXN],a[MAXN];

void extended_gcd(LL a,LL b,LL &d,LL &x,LL &y)

{

    if(!b)

    {

        d=a,x=1,y=0;

    }

    else

    {

        extended_gcd(b,a%b,d,y,x),y-=x*(a/b);

    }

}

LL no_coprime(LL n)

{

    LL mm,aa,x,y,c,d;

    aa=a[0],mm=m[0];

    for(int i=1; i<n; i++)

    {

        c=a[i]-aa;

        extended_gcd(mm,m[i],d,x,y);

        if(c%d!=0)

            return -1;

        m[i]/=d;

        x=((x*c/d)%m[i]+m[i])%m[i];

        aa=x*mm+aa;

        mm=mm*m[i];

    }

    return aa;

}

int main(void)

{

    LL n;

    while(cin>>n)

    {

        for(int i=0; i<n; i++)

            cin>>m[i]>>a[i];

        cout<<no_coprime(n)<<endl;

    }

    return 0;

}

 

 

你可能感兴趣的:(Integer)