洛谷 P1516 青蛙的约会
两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0
令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c
方程有解,当且仅当c%Gcd(a,b)=0
令r=Gcd(a,b)
为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解?
目标解aX+bY==c
有解的条件是c%r=0,也就是c=K*r
那么就办成了aX+bY=K*r
那么也就是解a*(X/K)+b(Y/K)=r
然后扩展欧几里得定理就是解a*X+b*Y=r
那么解出来X之后X就要乘上K也就是要乘上c/r
为了防止负数输出
#include<complex> #include<cstdio> using namespace std; long long x,y,l,x1,x2,m,n; long long Exgcd(long long a,long long b,long long &x,long long &y) { if(!b) { x=1;y=0; return a; } int r=Exgcd(b,a%b,x,y),tmp=x; x=y;y=tmp-a/b*y; return r; } int main() { scanf("%d%d%d%d%d",&x1,&x2,&m,&n,&l); if(m<n)swap(m,n),swap(x1,x2); int c=x2-x1,b=m-n; long long r=Exgcd(b,l,x,y); if(c%r)printf("Impossible\n"); else printf("%lld\n",(x*(c/r)+l/r)%(l/r)); return 0; }