poj1062

扩展欧几里得,注意一些小细节。

在sa+tb=L(扩展a和b,s和t是扩展出来的可变的系数)中,如果a,b同时为0的话,无论L是不是0都无法用扩展欧几里得求出正确的答案,要另求;只要a和b至少有一个不为0,则就可以用扩展欧几里得求出正确的答案。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

void exgcd(long long int *a,long long int *b,long long int p,long long int l,long long int *d){
    if(l==0){
        *a=1;
        *b=1;
        *d=p;

        return;
    }
    else{
        long long int a1,b1,d1;

        exgcd(&a1,&b1,l,p%l,&d1);
        *d=d1;
        *a=b1;
        *b=a1-p/l*b1;

        return;
    }
}

int main(){
    long long int x,y,m,n,l;
    long long int a,b;
    long long int p,q;
    long long int d;

    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    x=x%l;
    y=y%l;

    if(m>n){
        p=m-n;
        q=((y-x)%l+l)%l;//y-x写成了x-y
    }
    else{
        p=n-m;
        q=((x-y)%l+l)%l;//x-y写成了y-x
    }

    exgcd(&a,&b,p,l,&d);

    if(q%d){
        printf("Impossible\n");
    }
    else{
        a=a*q/d;
        if(a<0){
            a=a+((-a)/(l/d)+1)*(l/d);
        }
        else if(a>0){
            a=a%(l/d);
        }

        printf("%lld\n",a);
    }
}


转载于:https://www.cnblogs.com/ahahah/p/4918181.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值