Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
bezout_identity.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
#
include
"../../kyopro_library/math/extgcd.hpp"
3
4
/// @brief 一次不定方程式 ax+by=c を解く
5
/// @ref verify: https://atcoder.jp/contests/abc340/submissions/62495050
6
/**
7
* g=gcd(a,b) とする。extGCD(a,b) によって、ax'+by'=g を解く。
8
* 両辺を c/g 倍し x=x'*(c/g),y=y'*(c/g) とすると、ax+by=c を満たす。c が g で割り切れない場合、解は存在しない。
9
* ax+by=c の両辺を g で割ると、(a/g)*x + (b/g)*y = c/g となる。方程式の一般解を X,Y とおくと、(a/g)*(X-x) + (b/g)*(Y-y) = 0 を満たす。
10
* a/g と b/g は互いに素なので X-x は b/g の倍数であり、X=(b/g)*t+x となる。
11
* これを再代入すると、Y=-(a/g)*t+y を得る。
12
*/
13
struct
BezoutIdentity
{
14
/// @brief ax+by=c
15
BezoutIdentity
(ll a, ll b, ll c) : a(a), b(b), c(c), g(0), X(0), Y(0) {}
16
17
/// @brief 解が存在するか否かを返す
18
bool
build
() {
19
auto
[tmpg,tmpx,tmpy]=ExtGcd(abs(a),abs(b));
20
if
(c%g!=0)
return
false
;
21
g=tmpg; X=tmpx; Y=tmpy;
22
if
(a<0) X=-X;
23
if
(b<0) Y=-Y;
24
X*=c/g; Y*=c/g;
25
return
true
;
26
}
27
28
/// @brief 一般解を返す
29
pair
<
ll
,
ll
>
general_solution
(ll t=0) {
30
ll x=b/g*t+X, y=-a/g*t+Y;
31
return
{x,y};
32
}
33
34
private
:
35
ll a,b,c,g;
36
ll X,Y;
37
};
BezoutIdentity
一次不定方程式 ax+by=c を解く verify: https://atcoder.jp/contests/abc340/submissions/62495050
Definition
bezout_identity.hpp:13
BezoutIdentity::general_solution
pair< ll, ll > general_solution(ll t=0)
一般解を返す
Definition
bezout_identity.hpp:29
BezoutIdentity::build
bool build()
解が存在するか否かを返す
Definition
bezout_identity.hpp:18
BezoutIdentity::BezoutIdentity
BezoutIdentity(ll a, ll b, ll c)
ax+by=c
Definition
bezout_identity.hpp:15
math
bezout_identity.hpp
構築:
1.13.2