C++で y mod 2^x(2のx乗)の値を求める方法
この問題では、2つの値 x と y が与えられ、y を 2 の x 乗(2x)で割った余りの値を求めることが課題となります。
具体例を見て、問題の内容を確認しましょう。
入力 : x = 2, y = 19 出力 : 3
解説 −
y % 2x = 19 % 22 = 19 % 4 = 3
解法のアプローチ
最もシンプルな解法は、pow() 関数を使って 2x の値を直接計算し、その後で y % 2x を求める方法です。
もうひとつの効率的なアプローチとして、対数(log)を活用する方法があります。y < 2x が成り立つ場合、割り算の余りは y 自身と等しくなります。この条件は次のように表せます。
log2y < x
さらに、long long 型で扱える最大ビット幅を考慮すると、x の最大値は 63 です。x がこれを超えると 2x はオーバーフローしてしまいますが、この場合 y は必ず 2x より小さくなるため、余りは y 自身と一致します。
以上を踏まえると、処理は次の3つのケースに分けられます。
if(log2(y) < x) -> return y else if(x > 63) -> return y else -> return (y % pow(2, x))
実装例
この解法の動作を示すサンプルプログラムは以下の通りです。
#include <bits/stdc++.h>
using namespace std;
long long int findModVal(long long int y, int x){
if (log2(y) < x)
return y;
if (x > 63)
return y;
return (y % (1 << x));
}
int main(){
long long int y = 82829;
int x = 12;
cout<<"y mod 2^x の値は "<<findModVal(y, x);
return 0;
}
出力結果
y mod 2^x の値は 909
-
C++で二分木の各階層における最大値を見つける方法
二分木が与えられたとき、その木の各階層(レベル)ごとの最大値を求めることを考えます。例えば、次のような二分木があるとします。この場合、出力は [1, 3, 9] となります。ルート(最上位)の階層には「1」だけが存在するため、最大値は 1第1階層には「3」と「2」があり、最大値は 3第2階層には「5」「3」「9」があり、最大値は 9解決のためのアプローチこの問題は、再帰的な深さ優先探索(DFS) を使うことで簡潔に解くことができます。手順は以下の通りです。結果を格納するための配列 ans を定義します。再帰関数 solve() を定義します。この関数はツリーノードとレベル(初期値は 0)を引数
-
C++で二分木の最下層・左端の値を求める方法
二分木が与えられたとき、その木の最も深い行(最下層)における左端の値を求める問題を考えてみましょう。例えば、次のような二分木があるとします。 この場合、最下層は [7, 4] であり、その中で最も左にある要素は 7 なので、出力は 7 となります。 解法のアプローチ この問題は、深さ優先探索(DFS)を利用することでシンプルに解くことができます。ポイントは「必ず左側の子ノードから先に訪問する」ことです。こうすることで、それまでに到達した中で最も深いレベルへ最初に到達したノードが、自動的にそのレベルの左端のノードになります。 アルゴリズムの手順 最初に、答えを格納する ans と、現在の最大