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) : 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 一般解を返す
30 ll x=b/g*t+X, y=-a/g*t+Y;
31 return {x,y};
32 }
33
34private:
35 ll a,b,c,g;
36 ll X,Y;
37};
一次不定方程式 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