分析
根据题意本题的方程为:
$$ a+mx\equiv b+nx(\bmod L) $$
进一步变换得:
$$ (m-n)x\equiv (b-a)(\bmod L) $$
即使用扩展欧几里得求解方程:
$$ (m-n)x+Ly=(b-a) $$
解得特解$$ x_{0},y_{0} $$
$$ x=x_{0}+k\frac{L}{d} $$
$$ y=y_{0}+k\frac{m-n}{d} $$
之后判断(b-a)是否为d的倍数,不是则说明无解,输出”Impossible”
否则,将得到的x扩大(b-a)/d倍,然后输出其最小正整数解。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a,b,x,y,m,n,L;
LL exgcd(LL a,LL b,LL &x,LL &y) //扩展欧几里得
{
if(!b)
{
x=1,y=0;
return a;
}
LL d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
cin>>a>>b>>m>>n>>L;
b-=a; //提前让b=b-a
m-=n;
LL d = exgcd(m,L,x,y);
if(b%d) puts("Impossible"); //不整除,说明无解
else{
LL k=abs(L/d); //
x*=(b/d); //扩大(b-a)/d倍
cout<<(x%k+k)%k; //输出最小正整数解
}
return 0;
}