Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
extgcd.hpp
[詳解]
1#pragma once
2#include"../../kyopro_library/template.hpp"
3
4/**
5 * @brief 拡張ユークリッドの互除法
6 * @details
7 * gcd(a,b) = gcd(b%a,a), gcd(b,0) = b と b%a + (b/a)*a = b を使う。
8 * ax + by = g なる x,y を求めたい。
9 * 今、(b%a)X + aY = g なる X, Y が分かっている。
10 * (b%a)X = bX - (b/a)*a*X より、これを代入して、
11 * bX - (b/a)*a*X + aY = g
12 * a(Y-(b/a)*X) + bX = g
13 */
14tuple<ll,ll,ll> ExtGcd(ll a, ll b) {
15 if(a==0) return {b,0,1};
16 auto [g,s,t]=ExtGcd(b%a,a);
17 return {g,t-(b/a)*s,s};
18}
19
20/// @brief mod 逆元
21/// @brief a^(-1) (mod m)
22/// @note gcd(a,m)=1 でない場合、-1 を返す。
23ll ModInvGcd(ll a, ll m) {
24 // ax = 1 (mod m) <-> ax+my = 1 (mod m)
25 auto [g,x,y]=ExtGcd(a,m);
26 if(g!=1) return-1;
27 return (x+m)%m;
28}
tuple< ll, ll, ll > ExtGcd(ll a, ll b)
拡張ユークリッドの互除法
Definition extgcd.hpp:14
ll ModInvGcd(ll a, ll m)
mod 逆元
Definition extgcd.hpp:23