标签:
Description
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
/*/ 中文题: 题意,两只青蛙同向跳,要使得两只青蛙相遇,就要保证,在同一时间两只青蛙跳到同一个地点。 x+nX-(y+mX)=YL; X是跳的次数,Y是相差的圈数。 ==>x-y-X(n-m)=LY; 令A=x-y,B=n-m; 原式变为 A-BX=LY ==> LY+BX=A ==> BX=A(mod L) ; 然后就可以调用拓展欧几里德算法 exgcd(B,L,&X,&y); exgcd求出了方程的解,但是还要在做一步处理。 ans=xy/d*X%L/d+L/d; ans才是这个题目的最后答案。 能力有点渣,直接套的模版。 【TAT】数论虐我如菜虫,连菜鸡都不能算了。。。 AC模版。。。 /*/
#include"map" #include"cmath" #include"string" #include"cstdio" #include"vector" #include"cstring" #include"iostream" #include"algorithm" using namespace std; typedef long long LL; LL exgcd(LL a,LL b,LL &x,LL &y) { //直接引用保存整个过程中的(n-m)X+LY=x-y里的X和Y; if(!b) { x=1; y=0; return a; } LL d=exgcd(b,a%b,x,y); LL t=x; x=y; y=(t-a/b*y); return d; } int main() { LL x,y,m,n,L,X,Y; while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L)) { LL xy=x-y; LL d=exgcd(n-m,L,X,Y); if(xy%d!=0||m==n) { printf("Impossible\n"); continue; } LL r=L/d; LL ans=xy/d*X%r+r; printf("%lld\n",ans%r); } return 0; }
ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德
标签:
原文地址:http://www.cnblogs.com/HDMaxfun/p/5732350.html