青蛙的约会

分析:这个东西在数论里面应该叫做不定方程式,可以搜一下,有很精彩的证明,先求出来方程式的一组特解,然后用这组特解来求通解,但是求出来特解之后怎么求这些解里面的最小非负x值?我们知道 x = x0 + bt, 假设x=0, 也就是最小值, 那么 t = x0/(-b), x0+x0/(-b)*b就是最小值了,当然如果结果是负的加上一个b即可。

代码如下:

================================================================================================================================

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;

const int MAXN = 107;
const int oo = 1e9+7;

typedef long long LL;

LL ExGcd(LL a, LL b, LL &x0, LL &y0)
{
    if(b == 0)
    {
        x0 = 1, y0 = 0;
        return a;
    }

    LL d = ExGcd(b, a%b, x0, y0);

    swap(x0, y0);
    y0 = y0 - a/b * x0;///原式是 y0 = x0 - a/b * y0;

    return d;
}
int main()
{
    LL x1, x2, L1, L2, L;
    ///青蛙AB的起始位置x1,x2
    ///青蛙AB每次跳跃的长度L1,L2
    ///纬度总线长度L
    ///假设总共跳跃x次,那么青蛙A的跳跃长度是 x1 + x*L1
    ///青蛙B的跳跃长度是x2 + x*L2
    ///(x1+x*L1)-(x2+x*L2) = y*L ==> (L2-L1)*x+(L)*y = x1-x2;

    cin >> x1 >> x2 >> L1 >> L2 >> L;

    LL a = L2-L1, b = L, c = x1-x2, x0, y0;
    LL  d = ExGcd(a, b, x0, y0);

    if(c % d)
    {///条件不符合
        printf("Impossible
");
        return 0;
    }

    x0 = x0 * (c/d), y0 = y0 * (c/d);
    a /= d, b /= d;

    LL x = x0+x0/(-b)*b;

    if(x < 0)x += b;

    cout << x <<endl;

    return 0;
}
原文地址:https://www.cnblogs.com/liuxin13/p/4809554.html