利用扩展欧几里得公式求解同余方程
只需要将题意进行简单的转换就可以的到一个同余方程了,
然后就直接套扩展欧几里得的公式求解;值得注意的是,求出的第一组解
不一定满足要求,所以还需要通过通解公式求出第一组正整数解来。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long Gcd(long long a,long long b){
return b==0?a:Gcd(b,a%b);
}
void exGcd(long long a,long long b,long long &x,long long &y){
if(b==0){
x=1; y=0;
return ;
}
exGcd(b,a%b,x,y);
long long tmp=x;
x=y;
y=tmp-a/b*y;
}
int main(){
long long x,y,m,n,L;
long long a,c,k1,k2,r;
while(~scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)){
a=n-m; c=x-y;
r=Gcd(a,L);
if(c%r){
puts("Impossible");
continue;
}
a/=r; L/=r; c/=r;
exGcd(a,L,k1,k2);
long long ans=c*k1-c*k1/L*L;
if(ans<0)
ans+=L;
printf("%I64d\n",ans);
}
return 0;
}