C++ Library for Competitive Programming
#include "emthrm/math/ext_gcd.hpp"
$ax + by = \gcd(a, b)$ を満たす整数解 $(x, y)$ を求めるアルゴリズムである。
$ax + by = c \cdot \mathrm{gcd}(a, b)$ の特殊解を $(x, y) = (x^{\prime}, y^{\prime})$ とすると、一般解は $k \in \mathrm{Z}$ を用いて $(x, y) = \left(x^{\prime} + k \frac{b}{\mathrm{gcd}(a, b)}, y^{\prime} - k \frac{a}{\mathrm{gcd}(a, b)}\right)$ と表せる。
$O(\log{\max \lbrace A, B \rbrace})$
名前 | 戻り値 | 備考 |
---|---|---|
template <typename T> std::pair<T, T> ext_gcd(T a, T b);
|
$ax + by = \gcd(a, b)$ を満たす整数解 $(x, y)$ | $a \neq 0,\ b \neq 0$ のとき $\lvert x \rvert \leq \left\lvert \frac{b}{\mathrm{gcd}(a, b)} \right\rvert,\ \lvert y \rvert \leq \left\lvert \frac{a}{\mathrm{gcd}(a, b)} \right\rvert$ が成り立つ。 |
https://onlinejudge.u-aizu.ac.jp/solutions/problem/NTL_1_E/review/5272349/emthrm/C++17
#ifndef EMTHRM_MATH_EXT_GCD_HPP_
#define EMTHRM_MATH_EXT_GCD_HPP_
#include <tuple>
#include <utility>
namespace emthrm {
template <typename T>
std::pair<T, T> ext_gcd(T a, T b) {
T x = 1, y = 0;
for (T u = 0, v = 1; b;) {
const T q = a / b;
std::swap(a -= q * b, b);
std::swap(x -= q * u, u);
std::swap(y -= q * v, v);
}
return a < 0 ? std::make_pair(-x, -y) : std::make_pair(x, y);
}
} // namespace emthrm
#endif // EMTHRM_MATH_EXT_GCD_HPP_
#line 1 "include/emthrm/math/ext_gcd.hpp"
#include <tuple>
#include <utility>
namespace emthrm {
template <typename T>
std::pair<T, T> ext_gcd(T a, T b) {
T x = 1, y = 0;
for (T u = 0, v = 1; b;) {
const T q = a / b;
std::swap(a -= q * b, b);
std::swap(x -= q * u, u);
std::swap(y -= q * v, v);
}
return a < 0 ? std::make_pair(-x, -y) : std::make_pair(x, y);
}
} // namespace emthrm