您的位置:首页 > 其它

poj 1061-青蛙的约会-拓展gcd

2017-04-03 00:36 357 查看
赤裸裸的 拓展欧几里得的应用。

注意 无法完成的条件的限制

和为什么是 M-n不是 n-m;

x+m*t-y-n*t==l*p;//因为m小,所以m应该在前面的。

x-y==(n-m)*t+l*p;

欧几里得就带入 n-m 和 l 这俩参数

然后 就是模板的套路了,。

纯纯的模板

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define LL long long
using namespace std;
//x*a+y*b==gcd(a,b);
//(m-n)x+lb==X-Y;
//和 变量名字一样
// 拓展欧几里德。
long long exgcd(LL a,LL b,LL &x,LL &y)
{    if(b==0)
{     x=1;
y=0;
//如果b为0,那么gcd a就是a 啊;
return a;
}
LL r=exgcd(b,a%b,x,y);
LL t=x;
x=y;
y=t-a/b*y;
return r;
}

int main()
{   LL n,m,x,y,l;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l))
{   LL ar,al;
long long e=exgcd(n-m,l,ar,al);//为啥非得这样
if((x-y)%e||m==n)
{   printf("Impossible\n");
}
else
{
//   n*t+y+l*p=m*t+x;
//
LL mod=l/e;
LL ans=(ar%mod+mod)%mod;
printf("%lld\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: