Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 69307 | Accepted: 11162 |
Description
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
题目链接:http://poj.org/problem?id=1061
算法类型:数论,欧几里德拓展方程
解题思路:这是一道用欧几里德拓展方程解题的典型题目,但是单纯的欧几里德拓展方程解出来的没有考虑方向,由于题目规定了运动方向,所有如果解出来的数小于0,就利用欧几里德拓展方程的解系方程找出最小的正整数解。(这题要用__int64不然输出超限)
算法实现:
#include
#include
#include
__int64 gcd(__int64 a,__int64 b)
{
return b==0? a:gcd(b,a%b);
}
__int64 ex_gcd(__int64 a, __int64 b,__int64 &x,__int64 &y)
{
if(b==0){x=1;y=0;return a;}
__int64 d=ex_gcd(b,a%b,x,y);
__int64 t=x;x=y;y=t-a/b*y;
return d;
}
/*void ex_gcd(__int64 a,__int64 b,__int64& d,__int64& x,__int64& y)
{
if(!b){d=a;x=1;y=0;}
else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}
}*/
int main()
{
__int64 x,y,m,n,L;
while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)!=EOF)
{
__int64 a,b,c,k;
a=m-n;
b=L;
c=y-x;
__int64 temp=gcd(a,b);
if(c%temp!=0)
{
printf("Impossible\n");
}
else
{
__int64 T=c/temp;
__int64 d;
__int64 X,Y;
d=ex_gcd(a,b,X,Y);
X=X*T;
Y=Y*T;
k=-X/(b/temp);
X=X+k*(b/temp);
while(X<0)
{
if(b/temp>0)
X=X+b/temp;
else
X=X-b/temp;
}
printf("%I64d\n",X);
}
}
// printf("%I64d\n",gcd(-1,5));
return 0;
}