1 条题解
-
0
题意分析
题目背景
本题属于数论中的线性同余问题,模拟两只青蛙在环形轨道上跳跃的过程。给定它们的初始位置、每次跳跃的距离以及轨道长度,判断它们是否会相遇,并求出最早相遇时的跳跃次数。
核心问题
-
相遇条件:
设跳跃次数为,需满足两只青蛙在次跳跃后位于同一位置。- 青蛙A的位置:
- 青蛙B的位置:
等价于解方程:
-
方程转换:
整理后得到标准线性同余方程:记为:
其中,。
输入输出
- 输入:(初始位置、跳跃距离、轨道长度)。
- 输出:最小正整数解,或无解时输出
Impossible
。
解题思路
1. 线性同余方程的可解性
方程有解的条件是:
即必须是的倍数。
2. 扩展欧几里得算法
用于求解方程的整数解,进而得到特解:
3. 通解与最小正整数解
通解形式为:
最小正整数解通过对取模得到:
$$t_{\text{min}} = \left(t_0 \bmod \frac{L}{d} + \frac{L}{d}\right) \bmod \frac{L}{d} $$其中。
算法实现
代码框架
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll exgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return a; } ll d = exgcd(b, a % b, y, x); y -= a / b * x; return d; } int main() { ll x, y, m, n, L; cin >> x >> y >> m >> n >> L; ll a = m - n; ll b = y - x; if (a < 0) { a = -a; b = -b; } ll t, k; ll d = exgcd(a, L, t, k); if (b % d != 0) { cout << "Impossible" << endl; } else { t = t * (b / d); ll mod = L / d; t = (t % mod + mod) % mod; cout << t << endl; } return 0; }
关键步骤
- 参数处理:
确保为正,同时调整的符号。 - 求解方程:
调用exgcd
解,检查是否为0。 - 计算解:
特解缩放后取模得到最小正整数解。
复杂度分析
- 时间:(扩展欧几里得算法)。
- 空间:。
-
- 1
信息
- ID
- 62
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者