设 时 间 为 t i m e 设时间为time 设时间为time
由 题 意 可 列 出 方 程 : 由题意可列出方程: 由题意可列出方程:
( x + m ∗ t i m e ) (x + m * time) (x+m∗time) % \% % l = ( y + n ∗ t i m e ) l = (y + n * time) l=(y+n∗time) % \% % l ( 即 x + m ∗ t i m e = y + m ∗ t i m e l(即x+m*time=y+m*time l(即x+m∗time=y+m∗time ( m o l (mol (mol l ) ) l)) l))
⟹ x − y = ( n − m ) ∗ t i m e ( m o d \implies x - y = (n-m)*time(mod ⟹x−y=(n−m)∗time(mod l ) l) l)
⟹ x − y = ( n − m ) ∗ t i m e + n u m ∗ l ( n u m ∈ N ) \implies x - y = (n - m) * time + num * l(num\in \mathbb N) ⟹x−y=(n−m)∗time+num∗l(num∈N)
很 容 易 我 们 就 会 发 现 很容易我们就会发现 很容易我们就会发现, 这 就 是 个 这就是个 这就是个 扩 欧 扩欧 扩欧
所 以 所以 所以, 我 们 就 转 化 成 求 a x + b y = n 的 所 有 解 中 x 的 最 小 解 我们就转化成求ax+by=n的所有解中x的最小解 我们就转化成求ax+by=n的所有解中x的最小解
如 果 g c d ( a , b ) ∤ n 如果gcd(a,b)\nmid n 如果gcd(a,b)∤n, 那 么 无 解 那么无解 那么无解
如 果 g c d ( a , b ) ∣ n 如果gcd(a,b)\mid n 如果gcd(a,b)∣n, 设 a = a 0 ∗ g c d 设a = a_0 * gcd 设a=a0∗gcd, b = b 0 ∗ g c d b = b_0 * gcd b=b0∗gcd, n = n 0 ∗ g c d n = n_0 * gcd n=n0∗gcd
先 求 出 a 0 x + b 0 y = 1 的 一 组 解 x ′ ′ 先求出a_0x+b_0y=1的一组解x'' 先求出a0x+b0y=1的一组解x′′, y ′ ′ y'' y′′
然 后 a 0 x + b 0 y = n 0 的 所 有 解 可 以 表 示 为 { x ′ = n 0 x ′ ′ + b 0 t y ′ = n 0 y ′ ′ − a 0 t 然后a_0x+b_0y=n_0的所有解可以表示为\begin{cases}x'=n_0x''+b_0t\\y'=n_0y''-a_0t\end{cases} 然后a0x+b0y=n0的所有解可以表示为{x′=n0x′′+b0ty′=n0y′′−a0t ( t ∈ N ) (t\in \mathbb N) (t∈N)
( a ↓ (a↓ (a↓ b ↑ ) b↑) b↑)
该 解 同 时 也 是 a x + b y = n 的 所 有 解 该解同时也是ax+by=n的所有解 该解同时也是ax+by=n的所有解, 最 后 只 需 调 到 最 小 正 整 数 即 可 最后只需调到最小正整数即可 最后只需调到最小正整数即可
C O D I N G \mathbb{CODING} CODING
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t, num;
inline ll exgcd(ll a, ll b){
if(b == 0){
t = 1;
num = 0;
return a;
}
ll d = exgcd(b, a % b);
ll temp = t;
t = num;
num = temp - a / b * num;
return d;
}
signed main(){
ll x, y, m, n, l;
cin >> x >> y >> m >> n >> l;
ll a = x - y, b = n - m;
if(b < 0) a = -a, b = -b;
ll d = exgcd(b, l);
if(a % d != 0) cout << "Impossible\n";
else{
a /= d, l /= d;
t = ((t * a) % l + l) % l;//调
cout << t;
}
return 0;
}