This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub fffelix-huang/CP-stuff
#include "library/math/inv-gcd.hpp"
#pragma once #include "safe-mod.hpp" namespace felix { namespace internal { template<class T> constexpr std::pair<T, T> inv_gcd(T a, T b) { a = safe_mod(a, b); if(a == 0) { return {b, 0}; } T s = b, t = a; T m0 = 0, m1 = 1; while(t) { T u = s / t; s -= t * u; m0 -= m1 * u; auto tmp = s; s = t; t = tmp; tmp = m0; m0 = m1; m1 = tmp; } if(m0 < 0) { m0 += b / s; } return {s, m0}; } } // namespace internal } // namespace felix
#line 2 "library/math/safe-mod.hpp" namespace felix { namespace internal { template<class T> constexpr T safe_mod(T x, T m) { x %= m; if(x < 0) { x += m; } return x; } } // namespace internal } // namespace felix #line 3 "library/math/inv-gcd.hpp" namespace felix { namespace internal { template<class T> constexpr std::pair<T, T> inv_gcd(T a, T b) { a = safe_mod(a, b); if(a == 0) { return {b, 0}; } T s = b, t = a; T m0 = 0, m1 = 1; while(t) { T u = s / t; s -= t * u; m0 -= m1 * u; auto tmp = s; s = t; t = tmp; tmp = m0; m0 = m1; m1 = tmp; } if(m0 < 0) { m0 += b / s; } return {s, m0}; } } // namespace internal } // namespace felix