POJ 1061 青蛙的约会(扩展欧几里得)

来源:互联网 发布:jsp页面添加java代码 编辑:程序博客网 时间:2024/05/20 23:05





http://poj.org/problem?id=1061






分析:

由题意可知     求青蛙能否相遇     即求方程   (x+mt)%l=(y+nt)%l  中t的值    化简方程


(x + mt)%l = (y + nt)%l


x + mt - k1l = y + nt - k2l


(m - n)t + (k- k1)l = y - x


(m - n)t + kl = y - x


显而易见    这是一个扩展欧几里得      求一下t的最小正整解就好了




AC代码:

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <vector>#include <stack>#include <queue>#include <map>#include <set>#include<list>#include <bitset>#include <climits>#include <algorithm>#define gcd(a,b) __gcd(a,b)#define FINfreopen("input.txt","r",stdin)#define FOUT freopen("output.txt","w",stdout)typedef long long LL;const LL mod=1e9+7;const int INF=0x3f3f3f3f;const double PI=acos(-1.0);using namespace std;LL exgcd(LL a,LL b,LL &x,LL &y){      if (b==0){          x=1;      y=0;          return a;      }      LL ans=exgcd(b,a%b,y,x);      y-=(a/b)*x;      return ans;  } int main (){LL x,y,m,n,l;while (scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF){LL ans,X,Y;ans=exgcd(m-n,l,X,Y);if ((y-x)%ans){printf ("Impossible\n");continue;}X=(X*(y-x)/ans)%(l/ans);if (X<0) X+=fabs(l/ans);printf ("%lld\n",X);}return 0;}

原创粉丝点击