题解
2026-03-07 15:03:01
发布于:广东
5阅读
0回复
0点赞
#include<iostream>
using namespace std;
#define ll long long
/*
两只青蛙,在环形的数轴【L米】做跳跃:
1、青蛙A,起点为x, 每次跳m米
1、青蛙B,起点为y, 每次跳n米
两只青蛙同时起跳、每一跳一次的时间相同,
问跳几次能到达同一位置 ,若不能则 Impossible.
数学建模:
跳t次后:
青蛙 A 的位置:x+m * t
(环形数轴上的位置需对 L 取模,
但我们可以用 “距离差是 L 的整数倍” 来表示碰面)。
青蛙 B 的位置:y+n * t。
碰面: ( x+m * t ) - (y+n * t) = k * L
令 a = m-n,令 b = y-x,得到线性同余方程:
a * t ≡b ( mod L)
是求这个方程的最小正整数解 t
求解方程过程:
*/
// 扩展欧几里得函数:返回gcd(a,b),并通过引用返回x,y使得a*x + b*y = gcd(a,b)
ll f(ll a,ll b,ll &x,ll &y){
if(b==0){//终止条件:b=0时,x=1,y=0
x = 1;
y = 0;
return a;
}
ll d = f(b,a%b,x,y);//递归计算gcd(b, a mod b)
ll t = x;
x = y, y = t-a/b * y; // 核心转换:从下一层的x',y'得到当前层的x,y
return d;
}
int main(){
ll x,y,m,n,L,rx,ry;
cin>>x>>y>>m>>n>>L;
if(m>n) swap(m,n),swap(x,y);//n-m>0,负数处理
// 调用扩展欧几里得:求 (n-m)*rx + L*ry = gcd(n-m, L)
ll d = f(n-m,L,rx,ry);
rx = rx *(x-y) / d;
// 计算特解:rx = rx * (x-y)/d (对应化简后的方程特解)
// 检查无解条件:
// 1. m==n:速度相同,初始位置不同则永远追不上
// 2. (x-y)%d!=0:线性同余方程无解(b不能被d整除)
if(m==n || (x-y)%d !=0) cout<<"Impossible";
else cout<< (rx % (L/d) + L/d) % (L/d); // 调整为最小正整数解
return 0;
}
//Tian
这里空空如也







有帮助,赞一个