这个题虽说是exgcd简单的应用,但这个题还是很能说明问题的
首先 exgcd 是求 ax+by=c 其中c是a和b的gcd,,注意没有模
所以应用它解决同余方程,是利用了两个数的几倍之间的差必有一个为gcd
所以这个题就是:m-n为走一步, k*L为走k圈 (m-n)*t + k*L ==gcd(m-n,L)的解
那求这个的gcd有什么用呢 。。
原式 (m-n)*t == y-x (%L)
所以 (m-n)+L*k==y-x (%L)
所以如果有解 m-n+L*k一定有一个取值为y-x
同时,如果k=2*k, 答案即为 gcd*2%L
而我们求出的gcd,就是 (m-n)*t + k*L 取得第一个最小的正值
所以剩下的正值都是以gcd为基础的倍数,且由于gcd|L,所以不会有比他小的正整数取值
所以有解的条件是y-x%gcd==0;
然后如果y-x是gcd的倍数,t乘过去就好了
码:
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
ll x0,y0,x,y,n,m,l,gcd;
void exgcd(ll a,ll b)
{
if(!b)
{
x=1;
y=0;
gcd=a;
return;
}
exgcd(b,a%b);
ll t=x;
x=y;
y=t-a/b*y;
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&x0,&y0,&m,&n,&l);
ll tmp=y0-x0;
exgcd(m-n,l);
if(tmp%gcd)
{
printf("Impossible");
}else
{
x=x*(tmp/gcd)%l;
while(x<0)x+=l;
//if(x==0)x=l;
printf("%lld",x);
}
}