题解 P1516 青蛙的约会

Posted mark-x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P1516 青蛙的约会相关的知识,希望对你有一定的参考价值。

这道题,是一道挺有难度的题。

设两只青蛙跳了(a)步,则(A)蛙的坐标是(x+ma),(B)蛙的坐标是(y+na)

所以两只青蛙相遇的充分条件是(x+ma-(y+na) = Lb (b in Z))

提公因式得((m-n)a + (x-y) = Lb)

移项,方程两边同城(-1)((n-m)a + Lb = (x-y))

(x = (m-n)),(y = L),(d = gcd(x,y))

用扩展欧几里得解(xa + yb = d)的一组解((a,b))

((x-y) \% d eq 0)(m = n)无解

否则(a)就是我们求的一组解,但不一定是题目要求的解

所以还要对(a)进行操作

(c = (x-y)),为了方便表示我们(swap(x,a) swap(y,b))

呢么我们本来要解的方程式是(ax_0+by_0 = c)

但是我们解的方程式是(ax_1+by_1 = d)

对于这个方程我们同乘(frac{c}{d})(ax_1frac{c}{d}+by_1frac{c}{d} = c)

所以对于一组((x_1,y_1))符合(ax_1+by_1 = d),则必有一组((x_1frac{c}{d},y_1frac{c}{d}))符合(ax_0+by_0 = c)

又因为如果((x,y))是丢番图方程的一组解则((x-frac{b}{d} ,y+frac{a}{d}))也是一组解

所以如果我们知道(x)是一个正整数解,则最小就是让(x)不断地的减(frac{b}{d})这个过程就相当于取模((x_1frac{c}{d})\% frac{b}{d})

在把x,y,a,b换回来,并代入数据得(result = (a imes(frac{x-y}{d}) \% (frac{L}{d})+(frac{L}{d}))\%(frac{L}{d}))

coding

#include <iostream>
#define LL long long
using namespace std;


LL x,y,n,m,l;


inline LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(a == 0)
    {
        x = 0,y = 1;
        return b;
    }
    register LL d = exgcd(b%a,a,y,x);
    x -= b / a * y;
    return d;
}


int main()
{
    LL a,b,d;
    cin >> x >> y >>  m >> n >> l;
    if(n < m) swap(m,n), swap(x,y);
    d = exgcd(n-m,l,a,b);
    if((x-y) % d || m == n) puts("Impossible");
    else cout << (a*(x-y) / d % (l/d) + (l/d)) % (l/d) << endl;
    return 0;
} 

以上是关于题解 P1516 青蛙的约会的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)

P1516 青蛙的约会

[P1516]青蛙的约会

P1516 青蛙的约会

P1516 青蛙的约会 洛谷

P1516 青蛙的约会