关闭

POJ 1061 扩展欧几里得

103人阅读 评论(0) 收藏 举报
分类:
#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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31059次
    • 积分:2710
    • 等级:
    • 排名:第13287名
    • 原创:249篇
    • 转载:20篇
    • 译文:0篇
    • 评论:0条