您的位置:首页 > 其它

青蛙的约会 POJ - 1061 拓展欧几里得

2017-07-22 10:06 253 查看
这个主要是按照公式来,然后数很接近int 的边界了,随手long long~

A 青蛙 (x+m*t)%l

B 青蛙 (y+n*t)%l

(x+m*t)%l = (y+n*t)%l

—-> (m-n)*t+kl=y-x;

然后用通项求出最小解

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;

#define LL long long

void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b){
x=1;y=0;d=a;
}
else {
exgcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}
int main()
{
LL x,y,m,n,l;
while(scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&l)!=EOF){
LL z=(y-x+l)%l;
m=(m-n+l)%l;
LL k,t,d;
exgcd(m,l,d,t,k);
if(z%d) printf("Impossible\n");
else {
t=(t%l+l)%l;
m=m/d,l=l/d;
while(t>0) t=t-l;
while(t<0) t=t+l;
printf("%lld\n",t*(z/d)%l);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: