C++で指定範囲内の最大ビットANDペアを求める方法
問題の概要
範囲 [L, R] が与えられたとき、L ≤ X < Y ≤ R を満たす整数のペア (X, Y) の中から、ビットごとのAND(論理積)である X & Y が最大になる組み合わせを見つけ、その値を出力するのが課題です。
具体例
L = 1、R = 10 の場合を考えてみましょう。このとき最大のビットAND値は 8 となり、次のように求められます。
1000 # 8 の2進数表現 & 1001 # 9 の2進数表現 ---- 1000 # 最終結果 = 8
アプローチ
最もシンプルな方法は、L から R までのすべての数値ペアを総当たりで調べることです。各ペアに対してビットAND演算を実行し、その結果の中から最大値を記録していきます。すべてのペアを確認し終えた時点で保持されている最大値が答えとなります。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
int getMaxBitwiseAndValue(int L, int R) {
int maxValue = L & R;
for (int i = L; i < R; ++i) {
for (int j = i + 1; j <= R; ++j) {
maxValue = max(maxValue, (i & j));
}
}
return maxValue;
}
int main() {
int L = 1, R = 10;
cout << "Maximum value = " << getMaxBitwiseAndValue(L, R) << endl;
return 0;
}実行結果
Maximum value = 8
補足:計算量について
この総当たり方式は二重ループを使用するため、時間計算量は O((R−L)²) となります。初期値として L & R を設定しておくことで、わずかな効率化も図っています。範囲が狭い場合は十分実用的ですが、範囲が広くなると処理時間が急激に増加します。そのため、大きな範囲を扱うケースでは、ビット演算の性質(共通プレフィックスや2のべき乗の境界など)を活用したより効率的なアルゴリズムを検討するとよいでしょう。
-
C++でN個の未知整数の積Pから最大GCDを求めるアルゴリズム
2つの整数 N と P が与えられ、P が N 個の未知の整数の積であるとします。このとき、これらの整数のGCD(最大公約数)を求める必要があります。ただし、同じ積 P になる整数の組み合わせは複数存在し得るため、その中で最も大きなGCDを求めることが目標です。例として、N = 3、P = 24 の場合を考えてみましょう。積が24になる3つの整数の組み合わせには {1, 1, 24}、{1, 2, 12}、{1, 3, 8}、{1, 4, 6}、{2, 2, 6}、{2, 3, 4} などがあり、それぞれのGCDは 1, 1, 1, 1, 2, 1 となります。したがって、この場合の答えは 2
-
C++でGCDとLCMの値から条件を満たす数のペアの総数を求める方法
この記事では、最大公約数(GCD)と最小公倍数(LCM)の値が与えられたとき、その両方の条件を満たす整数のペアが全部で何通り存在するかを求める方法を解説します。 例として、GCDが2、LCMが12の場合を考えてみましょう。この条件を満たすペアは (2, 12)、(4, 6)、(6, 4)、(12, 2) の4つです。プログラムの目的は、このペアの総数「4」を計算することです。 解決の鍵となる数学的性質 2つの整数 a と b の間には、次のような重要な関係が常に成り立ちます。 a × b = GCD(a, b) × LCM(a, b) また、a と b はいずれも必ず GCD で割り切れるた