扩展欧几里得,注意一些小细节。
在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);
}
}