最大公約数と最小公倍数
カテゴリ: dynamic-programming
概要
最大公約数(GCD)と最小公倍数(LCM)は、整数論の基本的な概念であり、多くのアルゴリズム問題で重要な役割を果たします。GCDは2つ以上の整数の共通する約数のうち最大のもの、LCMは2つ以上の整数の共通する倍数のうち最小のものです。これらは、分数の約分、周期性の検出、暗号理論など、様々な応用があります。ユークリッドのアルゴリズムを使用することで、GCDを効率的に計算でき、GCDとLCMの関係式(a * b = GCD(a, b) * LCM(a, b))を利用してLCMも計算できます。これらの概念は、競技プログラミングや実際のソフトウェア開発で頻繁に使用されます。
コードテンプレート
// Java code not available
ひらめきのサポート
問題文に以下のようなキーワードや特徴がある場合、このパターンの適用を検討してみましょう。
チャート式ひらめきポイント
問題を読んだときに、「ソート済み配列で何かを見つける」「二つの要素の関係を調べる」「効率的に配列を操作する」などの特徴があれば、 双指針パターンが適用できる可能性が高いです。特に、O(n²)の計算量を避けたい場合に有効です。
このパターンを使用する問題例
- 1
分数の約分: 分子と分母のGCDで割ることで分数を最も簡単な形に約分
- 2
複数のタスクのスケジューリング: 異なる周期で実行されるタスクの同期ポイントを計算
- 3
暗号理論: RSA暗号などの公開鍵暗号方式でGCDを使用
- 4
循環小数の周期計算: 分数を小数に変換した際の循環部分の長さを求める
- 5
時計の問題: 異なる周期で動く針が重なる時間を計算
このパターンを使う問題
このパターンを適用して解くことができる実際の問題です。
3数の和
整数の配列 nums が与えられたとき、和が 0 になる 3 つの要素 nums[i], nums[j], nums[k] のすべての組み合わせを見つけてください。ただし、i != j, i != k...
自身を除く配列の積
整数の配列 nums が与えられたとき、各要素 nums[i] を除く配列内のすべての要素の積を含む配列 answer を返す関数を作成してください。 制約として、O(n) の時間複雑度で解き、除算...
2つのソート配列の中央値
2つのソート済み配列 `nums1` と `nums2` が与えられたとき、2つの配列をマージした結果の中央値を求めてください。 全体の実行時間の複雑度は O(log(m+n)) である必要がありま...
配列内のK番目に大きい要素
整数の配列 nums と整数 k が与えられたとき、配列内のk番目に大きい要素を見つけて返してください。 k番目に大きい要素とは、配列をソートした後にインデックス n-k の位置にある要素のことです...
最大部分配列
整数配列 `nums` が与えられたとき、連続する部分配列(少なくとも1つの要素を含む)の中で、その和が最大となるものを見つけ、その和を返す関数を実装してください。 部分配列とは、配列の連続した要素...