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
*/
14
tuple
<
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 を返す。
23
ll
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
}
ExtGcd
tuple< ll, ll, ll > ExtGcd(ll a, ll b)
拡張ユークリッドの互除法
Definition
extgcd.hpp:14
ModInvGcd
ll ModInvGcd(ll a, ll m)
mod 逆元
Definition
extgcd.hpp:23
math
extgcd.hpp
構築:
1.13.2