C++で K mod P = 0 かつ Q mod K = 0 を満たす最小の数 K を求める方法
問題の概要
2つの整数 P と Q が与えられたとき、次の条件を同時に満たす最小の整数 K を求める問題を考えてみましょう。
K mod P = 0 かつ Q mod K = 0
そのような K が存在しない場合は -1 を出力します。
例えば、P = 2、Q = 8 の場合、答えは K = 2 となります。なぜなら、2 mod 2 = 0 であり、8 mod 2 = 0 というように、両方の条件を満たすからです。
解法の考え方
この問題の鍵となるのは、条件を整理することです。
- K mod P = 0 より、K は P の倍数である
- Q mod K = 0 より、K は Q の約数である
P の倍数の中で最小のものは P そのものです。したがって、P が Q の約数(つまり Q % P == 0)であれば、答えは必ず P になります。逆に Q が P で割り切れない場合は、条件を満たす K は存在しないため、-1 を出力すればよいことになります。
サンプルコード
#include<iostream>
using namespace std;
int getMinK(int p, int q) {
if (q % p == 0)
return p;
return -1;
}
int main() {
int p = 24, q = 48;
cout << "Minimum value of K is: " << getMinK(p, q);
}出力
Minimum value of K is: 24
コードの解説
関数 getMinK では、まず Q を P で割った余りが 0 かどうかを判定しています。割り切れる場合は P をそのまま返し、そうでなければ -1 を返します。
この例では P = 24、Q = 48 であり、48 % 24 == 0 が成り立つため、結果として 24 が出力されます。
計算量
このアルゴリズムは剰余演算を1回行うだけなので、時間計算量は O(1) となり、非常に効率的です。
-
C++で配列内の a % b = k を満たすすべてのペア(a, b)を検索する方法
問題の概要配列 A が与えられたとき、その中から a % b = k を満たすすべてのペア(a, b)を見つけることを考えます。たとえば、配列 A = [2, 3, 4, 5, 7]、k = 3 の場合、条件を満たすペアは (7, 4)、(3, 4)、(3, 5)、(3, 7) となります。ここで注意したいのは、(a, b) が順序付きペアであるという点です。つまり (3, 4) と (4, 3) は別々の候補として扱われ、それぞれ剰余演算の結果が k と一致するかどうかが個別に判定されます。解法のアプローチこの問題は、ブルートフォース(総当たり)法によって解くことができます。手順は以下のとお
-
C++で「x + 桁の合計 = n」を満たす数xを見つける方法
この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。解き方のアプローチこの問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、そ