题目中文的,就不赘述题意了。
推理过程:
- 题目实际是求一个k,领得(km + x) %L == (kn + y)%L 。
- 上式可推理为 (k(m-n) + (x -y )) %L == 0
- 也就是求同余方程 ax %M == b %M
同余方程参考扩展欧几里德算法。网上有很多资料了,不再赘述。
#include <iostream>
using namespace std;
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{ if(b==0){
x=1;y=0;
return a;
}else{
long long r=extend_gcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
}
void solve(long long int a,long long int b,long long int M){
long long x, y;
long long gcd=extend_gcd(a,M,x,y);
if(b%gcd!=0)
cout<<"Impossible"<<endl;
else{
x=x*b/gcd;
int t=M/gcd;
if(x>=0)
x=x%t;
else
x=x%t+t;
cout<<x<<endl;
}
}
int main(int argc, char *argv[])
{
long long int x, y, m, n, L;
while(scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&L)!=EOF)
{
long long int a = m - n;
if( a < 0) a = (a + L) % L;
long long int b = y - x ;
if( b < 0) b = (b + L) % L;
solve(a, b, L);
}
return 0;
}