zoukankan      html  css  js  c++  java
  • POJ 1061 青蛙的约会(扩展欧几里德算法)

    题意:两只青蛙在同一个纬度上跳跃,给定每个青蛙的开始坐标和每秒跳几个单位,纬度长为L,求它们相遇的最短时间。

    析:开始,一看只有一组数据,就想模拟一下,觉得应该不会超时,但是不幸的是TLE了,我知道这肯定是一个数学题,不过刚开始没想到是扩展欧几里德,后来才发现这个可以转化为这个算法。

    我们假设刚开始它们的坐标分别是x,y,它们的速度分别是m,n,坐标轴长为L,那么经过t次跳跃后它们的距离之差就是L(想一想是不是,可以画图看看)。

    所以(mt-x) - (nt-y) = kL;可转化为kL + (n-m)t = x - y。只有满足gcd(L, n-m) 是x-y的倍数才有解。

    通过扩展欧几里德求得是t不一定是正数,所以我们要求最小的非负整数,tt = L / d, t = (t % tt + tt) % tt。

    代码如下:

    #include <iostream>
    
    using namespace std;
    typedef long long LL;
    
    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 n, m, xx, yy, d = 0, l, k, t;
        cin >> xx >> yy >> m >> n >> l;
        exgcd(l, n-m, d, k, t);
        if((xx-yy) % d != 0)  cout << "Impossible
    ";
        else{
            t = t * ((xx-yy)/d);
            LL tt = l / d;
            t = (t % tt + tt) % tt;
            cout << t << endl;
    
        }
        return 0;
    }
    
  • 相关阅读:
    逻辑地址、线性地址、物理地址
    查找已知字符串子串
    替换字符串中的空格为%20
    资本的奥秘
    net::ERR_CONNECTION_RESET的处理方法
    SQL Server数据库从低版本向高版本复制数据库
    中式思维的五大逻辑缺陷(转)
    1年PK12年,中国式教育完败(转载)
    有关衣服的想法
    jquery邮箱自动补全
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5517725.html
Copyright © 2011-2022 走看看