[luoguP1516] 青蛙的约会(扩展欧几里得)
对于数论只会gcd的我,也要下定决心补数论了
列出方程
- (x + t * m) % l = (y + t * n) % l
那么假设 这两个式子之间相差 num 个 l,即为
- x + t * m = y + t * n + num * l
经过化简得
- (n - m) * t + l * num = x - y
那么可以用扩展欧几里得求出结果
——代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <cstdio> #define LL long long inline void exgcd(LL a, LL b, LL &d, LL &x, LL &y) { if (!b) d = a, x = 1, y = 0; else exgcd(b, a % b, d, y, x), y -= x * (a / b); } int main() { LL x, y, m, n, l, d, t, num; scanf ( "%lld %lld %lld %lld %lld" , &x, &y, &m, &n, &l); if (n - m < 0) x ^= y ^= x ^= y, n ^= m ^= n ^= m; exgcd(n - m, l, d, t, num); if ((x - y) % d) puts ( "Impossible" ); else l = l / d, printf ( "%lld\n" , ((x - y) / d * t % l + l) % l); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步