C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】指定された範囲内で x が y を割り切るペア(x, y)を O(1) で見つける方法

今回は興味深いアルゴリズムの問題を取り上げます。範囲 l ≤ x, y ≤ r を満たすペア(x, y)を見つけるというもので、このペアには「x が y を割り切る」という性質が必要です。条件を満たすペアが複数存在する場合は、そのうちの 1 つを出力すればよいことになっています。

解法のアイデア

この問題は、実は O(1) の計算量で解くことができます。鍵となるのは、下限値 l とその 2 倍の値 2l です。

その理由を考えてみましょう。y/x の最小値は 2 です。もし範囲内により大きな値(y/x ≥ 3 となる組み合わせ)が存在するなら、必ず y/x = 2 となる組み合わせも同じ範囲内に存在します。また、x を大きくすれば 2x もそれに伴って大きくなるため、範囲内に収まる最小のペアは必ず (l, 2l) になります。

したがって、2l ≤ r が成り立つならば (l, 2l) が答えとなり、それ以外の場合は条件を満たすペアは存在しません。

実装例(C++)

#include<iostream>
using namespace std;

void getPair(int l, int r) {
    int x = l;
    int y = 2 * l;
    cout << "(" << x << ", " << y << ")" << endl;
}

int main() {
    int l = 3, r = 6;
    getPair(l, r);
}

実行結果

(3, 6)

まとめ

この問題は一見すると範囲内の全組み合わせを調べる必要がありそうですが、「x が y を割り切る」という条件と「y/x の最小値は 2」という性質を利用することで、定数時間で答えを導き出せます。範囲の下限 l と 2l の関係を確認するだけでよいため、非常に効率的な解法といえます。

  1. C++で指定された差分を持つペアを見つける方法

    はじめに 配列 A に n 個の異なる要素が格納されているとします。この配列から、2つの要素 x と y の差が指定された値 d と一致するようなペア (x, y) をすべて見つける必要があります。 例として、配列が A = [10, 15, 26, 30, 40, 70]、指定された差分が 30 である場合を考えます。このとき、該当するペアは (10, 40) と (40, 70) です。 解法:ツーポインタ法 この問題は、配列が昇順にソートされていることを前提とすれば、ツーポインタ(二重インデックス)法を使って効率的に解くことができます。まず、1つ目のポインタ「i」を先頭の要素に、2つ目の

  2. C++で「x + 桁の合計 = n」を満たす数xを見つける方法

    この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。解き方のアプローチこの問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、そ