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

来源:互联网 发布:淘宝付费流量来源有 编辑:程序博客网 时间:2024/05/21 22:35

以前对其理解有误,由于其和中国剩余定理有一定相似的地方,写这篇文章开始将其命名为中国剩余定理的不互质情况,为了与中国剩余定理区分,将这篇正式更名为解一元线性同余方程组,这样或许更加严谨一点。过几天再写真正的中国剩余定理。

关于公式的证明

代码部分参考HIT出版的《数论及其应用》

#include <cstdio>using namespace std;typedef long long ll;void Ext_Gcd(ll a,ll b,ll &d,ll &x,ll &y){    if(!b){        x=1;        y=0;        d=a;    }    else    {        Ext_Gcd(b,a%b,d,x,y);        ll t=x;        x=y;        y=t-a/b*y;    }}int main(){    ll n;    while(~scanf("%I64d",&n)){        bool ifhave=true;        ll a1,r1,a2,r2;        scanf("%I64d%I64d",&a1,&r1);        for(ll i=1;i<n;i++)        {            scanf("%I64d%I64d",&a2,&r2);            ll a=a1,b=a2,c=r2-r1,d,x,y;            Ext_Gcd(a,b,d,x,y);            if(c%d) ifhave=false;            ll t=b/d;            x=x*c/d;            x=(x%t+t)%t;            r1=a1*x+r1;            a1=a1/d*a2;        }        if(ifhave) printf("%I64d\n",r1);        else printf("-1\n");    }    return 0;}