现在才AC这道题,无限囧。。记得老早就看过这道题
题目大意:青蛙A的出发点为x,青蛙B的出发点为y,A跳一次m米,B跳一次n米。所在的纬度线(一圈)为L;
思路:扩展欧几里得的入门题:
(1)、两者相遇的条件:x+mt-y-nt=pL
(n-m)t+Lp=x-y;
即是:at+bp=x-y
求出最小的t
所以先要求出gcd(a,b);
即是:exgcd(n-m,L,ar,br);//ar,br对应于关系于t,p;
此函数返回 M=gcd(n-m,L);
X=ar(对应的关系);
(2)、如果(x-y)%M==0,则有解
(3)、有解后:X=X(x-y)/M;
最后:(X%(L/M)+L/M)%(L/M)就是最后的解,也就是本题中t的值;(写了这些感觉都是在默写~~还不是很透彻理解~~囧。。)
AC program: #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; typedef __int64 LL ; LL exgcd(LL a,LL b,LL &x,LL &y) { LL t,d; if(b==0) { x=1; y=0; return a; } d=exgcd(b,a%b,x,y); t=x; x=y; y=t-(a/b)*y; return d; } int main() { LL x,y,m,n,l; while(cin>>x>>y>>m>>n>>l) { LL ar,br,M; M=exgcd(n-m,l,ar,br); if((x-y)%M || m==n) cout<<"Impossible"<<endl; else { ar=ar*(x-y)/M; LL s=l/M; cout<<(ar%s+s)%s<<endl; } } }