POJ 1061 扩展欧几里得
#include"stdio.h"
#include"iostream"
#include"math.h"
#include"algorithm"

using namespace std;
typedef long long ll;

void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(b==0){d=a;x=1;y=0;return;}
    ll x1,y1;
    gcd(b,a%b,d,x1,y1);
    ll t1,t2;
    t1=x1;t2=y1;
    x=t2;y=t1-(a/b)*t2;
}
/*
void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(!b){d=a;y=0;x=1;}
    else{
        gcd(b,a%b,d,y,x);y-=(a/b)*x;
    }
}
*/
int main()
{
    ll m,n,l,x,y;
    while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l)==5)
    {
        ll a,b,c;
        a=m-n;b=l;c=(y-x);  //(x+dm)%l=(y+dn)%l;  同余然后用扩展欧几里得 解出x,y
        if(a<0)
        {
            a=-a;c=-c;
        }
        ll sx,sy,g;
        gcd(a,b,g,sx,sy);
        if(c%g)             //当 c不是最大公约数的整数倍的时候说明无解
        {
            puts("Impossible");continue;
        }
        b/=g;                     
        c/=g; //倍数
        ll t=c*sx;
        printf("%d\n",(t%b+b)%b);
    }
    return 0;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32454729/article/details/52371934
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

POJ 1061 扩展欧几里得

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭