1. paizaラーニングトップ
  2. レベルアップ問題集
  3. ユークリッドの互除法メニュー応用編(言語選択)
  4. 問題一覧 Perl編
  5. 拡張ユークリッドの互除法 Perl編

ユークリッドの互除法メニュー応用編のサムネイル
拡張ユークリッドの互除法 Perl編(paizaランク C 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

割り算から一次方程式の解を求める方法とユークリッドの互除法を応用させると、整数 A , B を用いた一次方程式 Ax + By = gcd(A, B) の整数解 x , y を求めることができます。
この x , y を求めるアルゴリズムを拡張ユークリッドの互除法といいます。
拡張ユークリッドの互除法の疑似コードは以下の通りです。


// ax + by = gcd(a,b) の答えを x , y に代入するプログラム

extgcd(a, b, x のポインタ, y のポインタ) {
c = a;
if (b != 0) {
c = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1;
y = 0;
}
return c;
}


ポインタ変数のない言語を使用する場合は次の疑似コードを参考にしてください。

// ax + by = gcd(a,b) を満たす x, y と gcd(a,b) を返すプログラム

ectgcd(a, b) {
if b( != 0) {
c, y, x = extgcd(b, a % b)
y -= (a / b) * x
return c, x, y // 最終的に返される c が gcd(a,b) となる
}
return a, 1, 0
}


整数 A , B が与えられるので、拡張ユークリッドの互除法を用いて Ax + By = gcd(A, B) の整数解 x , y を求めてください。

入力される値

A B


・1 行で、整数 A , B が半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

x y


Ax + By = gcd(A , B) の整数解 x , y の値を 1 行で半角スペース区切りで出力してください。
・整数解 x, y は -100,000 ≦ x, y ≦ 100,000 を満たすものであれば、どれを出力しても良いです。
・また、出力の末尾には改行を入れてください。

条件

・1 ≦ A , B ≦ 100,000

入力例1

2944 3958

出力例1

-929 691

入力例2

2 7

出力例2

-3 1

問題一覧へ戻る

ページの先頭へ戻る