poj 1061 扩展欧几里德算法 青蛙的约会,x,y代表在X的轴坐标,n,m代表依次能跳多远,l代表周长 求(n-m)*s+l*t=x-y;

#include <stdio.h>
#define abs(a) ((a)<0?-(a):(a))
__int64 gcd(__int64 a,__int64 b)
{
    return !b?a:gcd(b,a%b);
}
void exgcd(__int64 i,__int64 j,__int64 &a,__int64 &b)
{
    if(!j) a=1,b=0;
    else exgcd(j,i%j,b,a),b-=(a*(i/j));
}
int main()
{
    __int64 x,y,n,m,l;
    while(scanf("%I64d %I64d %I64d %I64d %I64d",&x,&y,&m,&n,&l)==5)
    {
        x=(x+l)%l;
        y=(y+l)%l;
        __int64 i,j,k,r,a,b; 
		i=n-m,j=l,k=x-y;
        r=gcd(i,j);
        if(k%r)
            printf("Impossible\n"); 
		else
        {
            k/=r,i/=r,j/=r;
            exgcd(i,j,a,b); 
			a=(k*a)%j;
            if(a<0) a+=abs(j); 
			printf("%I64d\n",a); 
       } 
   }
    return 0;
}

   x = n' * x0 + b' * t
       y = n' * y0 - a' * t

posted @ 2012-04-18 10:39  shijiwomen  阅读(333)  评论(0编辑  收藏  举报