其实这是一道正常人都可以秒掉的题目,看过扩展欧几里得,但是没有看到一些算法上的细节。以及求ax≡b(mod n)中的X解的细节。没有注意到X0要(mod n)
所以不多说只是上代码:
#include<stdio.h>
long long n,m,x,y,l,d,x1,y2;
void extend_Eulid(int a,int b){
long long temp;
if(b == 0){
x1= 1;y2= 0;d= a;
}
else{
extend_Eulid(b,a%b);
temp=x1;
x1=y2;
y2=temp-a/b*y2;
}
}
main(){
long long t,p,i,temp;
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
if(m-n<=0){
temp=m;
m=n;
n=temp;
temp=x;
x=y;
y=temp;
}
extend_Eulid(m-n,l);
if((x-y)%d==0){
p=(y-x)/d;
x1=p*x1;
x1=x1%l;
for(i=0;i<=d-1;i++){
if(x1<=0){
x1=x1+l/d;
}
else
break;
}
printf("%lld\n",x1);
}
else
printf("Impossible\n");
}