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*/
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 一般解を返す
34 ll x=b/g*t+X,y=-a/g*t+Y;
35 return {x,y};
36 }
37
38private:
39 ll a,b,c,g;
40 ll X,Y;
41};
一次不定方程式 ax+by=c を解く verify: https://atcoder.jp/contests/abc340/submissions/62495050
pair< ll, ll > general_solution(ll t=0)
一般解を返す
bool build()
解が存在するか否かを返す
BezoutIdentity(ll a, ll b, ll c)
ax+by=c