是一个裸的扩展欧几里得。式子大约是(m-n)*a-L*k=y-x。把求出的gcd和y-x对比,如果y-x不是gcd的倍数则无解。否则把x相应扩大即可。
如果最后得到的x是个负数,就把它变成x%L+L。
要用long long
#include<iostream> #include<cstdio> #include<cmath> using namespace std; long long xx,yy,m,n,L; long long x,y; int exgcd(int a,int b,int& x,int& y) { int d = a; if(b != 0) { d = exgcd(b,a%b,y,x); y -= (a/b) * x; } else{ x = 1; y = 0; } return d; } int main() { scanf("%lld%lld%lld%lld%lld",&xx,&yy,&m,&n,&L); if(n < m) { swap(n,m); swap(xx,yy); } int x,y; int g = exgcd(n-m,L,x,y); //cout<<g<<endl; if((xx - yy) % g == 0) { long long ans = x * (xx-yy)/g; // cout<<ans<<endl; if(ans >=0) ans %= L; else ans = ans%L+L; printf("%lld\n",ans); } else puts("Impossible"); return 0; }