首先理解题意:两只青蛙必须在同一时刻跳到同一位置,才有可能见面,我们可以将首尾相连的经度圈围成一个圈,我们以第一组测试数据为例,给出下面的图片:那么怎样才可以得到它的数学模型呢?
从网上搜到的资料:(x+t*m)-(y+t*n)=l*C;其中x,y,m,n是题目中的意义,t跳的次数,l是圈数,C是周长,想想也有道理,我觉得谁减谁都可以,接下来整理得:(n-m)*t+l*c=x-y;令a=m-n,b=l,c=gcd(a,b),d=x-y,
即a*t+b*c=d(1);
欧几里得算法 具体过程及其证明求其中t的最小整数解,利用扩展欧几里得算法我们可以求出其中一组解t0,c0,并令
c=gcd(a,b),a*t0+b*c0=c (2)
因为c=gcd(a,b),所以a*t/c是整数,b*t/c是整数,那么d/c也须为整数,否则无解.
(2)两边同时*d/c,得
a*t0*(d/c)+b*p0*(d/c)=d;即t0*(d/c)就是最小的整数解,但有可能是负数,如下变形:a*(t0*(d/c)+b*n)+b*(p0*(d/c)-a*n)=d,
接下来就是(t0*(d/c)%b+b)%b就是想要的结果(我现在也不是很明白):
再就是扩展欧几里得算法的推导过程(待续)
从网上搜到的资料:(x+t*m)-(y+t*n)=l*C;其中x,y,m,n是题目中的意义,t跳的次数,l是圈数,C是周长,想想也有道理,我觉得谁减谁都可以,接下来整理得:(n-m)*t+l*c=x-y;令a=m-n,b=l,c=gcd(a,b),d=x-y,
即a*t+b*c=d(1);
欧几里得算法 具体过程及其证明求其中t的最小整数解,利用扩展欧几里得算法我们可以求出其中一组解t0,c0,并令
c=gcd(a,b),a*t0+b*c0=c (2)
因为c=gcd(a,b),所以a*t/c是整数,b*t/c是整数,那么d/c也须为整数,否则无解.
(2)两边同时*d/c,得
a*t0*(d/c)+b*p0*(d/c)=d;即t0*(d/c)就是最小的整数解,但有可能是负数,如下变形:a*(t0*(d/c)+b*n)+b*(p0*(d/c)-a*n)=d,
接下来就是(t0*(d/c)%b+b)%b就是想要的结果(我现在也不是很明白):
再就是扩展欧几里得算法的推导过程(待续)
#include <iostream>
#include <cstdio>
using namespace std;
long long x0,y0,q;
long long ex_eulid(long long a,long long b)
{
if(b==0)
{
x0=1;y0=0;q=a;//q就是那个gcd(a,b);不能返回值,函数中的这些数据都是有
//用的
}
else
{
ex_eulid(b,a%b);
long long tmp=x0;
x0=y0;
y0=tmp-a/b*y0;//为什么呢??这些x,y,q就是扩展欧几里得的结果
}
}
int main()
{
long long v,x,y,n,m,l;
int ok=0;
long long a,b,c,d;
// cin>>a>>b;
cin>>x>>y>>n>>m>>l;
if(n==m)
{
ok=1;
//break;
}
else
{
a=m-n;b=l;
//c=q;
d=x-y;
ex_eulid(a,b);
if(d%q!=0)
ok=1;
}
if(ok)
{
printf("Impossible\n");
// break;
}
else
{
b=b/(q);
d=d/(q);
v=d*(x0);
cout<<(v%b+b)%b<<endl;
}
return 0;
}