美文网首页
HDU-6624 (杭电多校第5场 fraction)辗转相除

HDU-6624 (杭电多校第5场 fraction)辗转相除

作者: 叔丁基锂_ | 来源:发表于2019-08-06 13:51 被阅读0次

题意:给定x和p,求一个最小的b使得存在一个a<b 并且a \equiv b x(\bmod p)

题解:由于a \equiv b x(\bmod p) , 那么 \exists y>0, bx-a=py , 于是0<a=bx-py<b ,从而\frac{p}{x}<\frac{b}{y}<\frac{p}{x-1} 。那么我们就是要求一个最小的b,这就可以通过辗转相除(出题人管这叫辗转相除):

Let's consider we are solving problem for \left[\frac{p_{1}}{q_{1}}, \frac{p_{2}}{q_{2}}\right] .

Here are three cases:

  1. \frac{p_{1}}{q_{1}} \geq 1. Let's subtract \left\lfloor\frac{p_{1}}{q_{1}}\right\rfloor from both numbers. Obviously, solution is same up to adding it back.

  2. \frac{p_{1}}{q_{1}}<1<\frac{p_{2}}{q_{2}}. then 1/1 is answer! Note, that it minimize both parts of fraction.

  3. \frac{p_{2}}{q_{2}} \leq 1. Let's solve for \left[\frac{q_{2}}{p_{2}}, \frac{q_{1}}{p_{1}}\right]. This is the same problem (up to answer inverse), but now we need, to minimize numerator, not denominator. But this doesn't matter, because step 2 optimize both!

——PavelKunyavskiy’ s comment :https://codeforces.com/blog/entry/67091?#comment-512389

btw, 出题人提到这个算法来自于 Code Jam 2019 Round 2 - New Elements Part 2 ,上述的算法描述也是这么找的

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pll = pair<ll, ll>;

pll find_best(pll l,pll r){
    if(l.first>=l.second){
        ll fl = l.first / l.second;
        pll res = find_best({l.first - fl * l.second, l.second}, {r.first - fl * r.second, r.second});
        res.first += res.second * fl;
        return res;
    }
    if(r.first>r.second){
        return {1, 1};
    }
    pll res = find_best({r.second, r.first}, {l.second, l.first});
    return {res.second, res.first};
}

int main()
{
    ios::sync_with_stdio(false);
    int round;
    cin >> round;
    while (round--)
    {
        ll p, x;
        cin >> p >> x;
        auto res = find_best({p, x}, {p, (x - 1)});
        ll b = res.first;
        ll y = res.second;
        cout << (b * x - p * y) << "/" << b << endl;
    }
}

相关文章

  • HDU-6624 (杭电多校第5场 fraction)辗转相除

    题意:给定x和p,求一个最小的b使得存在一个 并且。 题解:由于 , 那么 , , 于是 ,从而 。那么我们就是...

  • 算法-辗转相除法

    算法:辗转相除法(欧几里得算法) GCD递归定理 辗转相除法算法概述 辗转相除法伪代码 辗转相除法代码实现 对于两...

  • 求最大公约数

    辗转相除法

  • 辗转相除法

  • 辗转相除法

    大家好,我是BUG,继算法专辑之后,我现在发出了数学专辑,研究和编程相关的数学问题。讲解之前,别忘了收藏我的编程专...

  • 辗转相除法

    如果b等于0,计算结束,a就是最大公约数 否则,计算a除以b的余数,让a等于b,b等于那个余数 回到第一步

  • 辗转相除法

    求两个数a和b的最大公约数的算法: 1、如果b等于0,计算结束,a就是最大公约数; 2、否则,计算a除以b的余数,...

  • 辗转相除法

    辗转相除法(欧几里得算法)求两个数的最大公约数和最小公倍数?1、最大公约数思路:大数除以小数,如果能够整数,则小数...

  • 辗转相除法求最大公因数 2020-03-12

    今天做了一道题,需要求最大公因数,已经完全把辗转相除法忘记了,特此记录 辗转相除法 辗转相除法,也叫欧几里得算法,...

  • 最大公约数与最小公倍数:辗转相除法

    已知两个数x和y,求x和y的最大公约数 暴力循环求解: 辗转相除法求解: 辗转相除法递归求解: 理解辗转相除法: ...

网友评论

      本文标题:HDU-6624 (杭电多校第5场 fraction)辗转相除

      本文链接:https://www.haomeiwen.com/subject/lobidctx.html