• 青蛙的约会


    分析:这个东西在数论里面应该叫做不定方程式,可以搜一下,有很精彩的证明,先求出来方程式的一组特解,然后用这组特解来求通解,但是求出来特解之后怎么求这些解里面的最小非负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;
    }
  • 相关阅读:
    监听
    用户管理
    oracle网络
    实例 参数
    存储管理
    oracle 体系
    实例
    修改
    集合操作
    17.08.18
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4809554.html
Copyright © 2020-2023  润新知