擴展歐幾里得。
幾個很弱智的錯誤點。
1、exgcd的引用“&”
2、當用p,q代替exgcd的x,y時,遞歸時仍然寫的x,y
3、遞歸時忘了交換x,y位置
4、解是c/d*p,不要忘了/d。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll l,x,y,m,n;
ll exgcd(ll a,ll b,ll &p,ll &q)
{
if(b==0)
{
p=1,q=0;
return a;
}
ll d=exgcd(b,a%b,q,p);
q-=(a/b)*p;
return d;
}
int main()
{
while(cin>>x>>y>>m>>n>>l)
{
if(m<n)
{
swap(m,n);
swap(x,y);
}
ll p,q;
ll d=exgcd(m-n,l,p,q),c=((y-x)%l+l)%l,k=l/d;
if(c%d!=0) cout<<"Impossible"<<endl;
else cout<<(c/d*p%k+k)%k<<endl;
}
}