根据题意写出同余方程
- x + m k ≡ y + n k ( m o d L ) x+mk \equiv y+nk(mod \,L) x+mk≡y+nk(modL)
然后转化成不定方程
- ( n − m ) k + L t = ( x − y ) (n-m)k+Lt=(x-y) (n−m)k+Lt=(x−y)
根据题意求出最小正整数解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x,y,m,n,l;
ll A,B,C,D,X,Y;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
ll g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
int main()
{
cin>>x>>y>>m>>n>>l;
A=n-m;
B=l;
C=x-y;
D=exgcd(A,B,X,Y);
if(C%D!=0)
{
printf("Impossible");
}
else
{
X*=C/D;
B/=D;
if(B<0) B=-B;//B有可能为负
X=(X%B+B)%B;
cout<<X;
}
}
//注意A有可能为负导致D为负数,所以B有可能为负,注意B要是正数