这道题是比较经典的欧几里得扩展的题目。
通过从题目的意思得到一个等式,再通过一些操作,使之化成ax+by=tgcd(a+b)的式子,求出x再乘上t即可。
通过从题目的意思得到一个等式,再通过一些操作,使之化成ax+by=tgcd(a+b)的式子,求出x再乘上t即可。
因为ax+by=gcd 是必有解的。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long int gcd(long long int a,long long int b)
{
return b==0? a:gcd(b,a%b);
}
void ex(long long int a,long long int b,long long int &x,long long int &y,long long int &d)
{
if(b==0){
d=x;
x=1;y=0;
}
else {
ex(b,a%b,y,x,d);
y-=x*(a/b);
}
}
int main(){
long long int x1,y1,m,n,l;
while(cin>>x1>>y1>>m>>n>>l)
{
long long int t=x1-y1;
long long int gc=gcd(n-m,l);
if(t%gc!=0)
{
cout<<"Impossible"<<endl;
}
else {
long long int a=n-m,b=l,x,y,d;
ex(a,b,x,y,d);
x=((x*t/gc)%l+l)%l;
if(x==0)x+=l;
cout<<x<<endl;
}
}
return 0;
}
//欧几里得扩展