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) {
16
this
->a=a;
17
this
->b=b;
18
this
->c=c;
19
}
20
21
/// @brief 解が存在するか否かを返す
22
bool
build
() {
23
auto
[g,X,Y]=ExtGcd(abs(a),abs(b));
24
if
(c%g!=0)
return
false
;
25
this
->g=g,
this
->X=X,
this
->Y=Y;
26
if
(a<0)
this
->X=-
this
->X;
27
if
(b<0)
this
->Y=-
this
->Y;
28
this
->X*=c/g,
this
->Y*=c/g;
29
return
true
;
30
}
31
32
/// @brief 一般解を返す
33
pair
<
ll
,
ll
>
general_solution
(ll t=0) {
34
ll x=b/g*t+X,y=-a/g*t+Y;
35
return
{x,y};
36
}
37
38
private
:
39
ll a,b,c,g;
40
ll X,Y;
41
};
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:33
BezoutIdentity::build
bool build()
解が存在するか否かを返す
Definition
bezout_identity.hpp:22
BezoutIdentity::BezoutIdentity
BezoutIdentity(ll a, ll b, ll c)
ax+by=c
Definition
bezout_identity.hpp:15
math
bezout_identity.hpp
構築:
1.13.2