問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
高速に累乗を計算する方法として、繰り返し二乗法というものがあります。
このアルゴリズムは、a の b 乗 (a ^ b) を、 a ^ (2 ^ i) 乗を用いて表すことで計算量を落とすアルゴリズムです。
まず b の 2 進数表現を考えます。b の最下位の桁が 1 かどうかを確認します。
最下位の桁が 1 の場合、 a を ans にかけます。
この処理が終わったら、a を a の 2 乗に置き換え、b を右に 1 ビットシフト(割る 2)します。
ex) 2^13の場合2^13 = 2^8 * 2^4 * 2^1
13 = 1101(2)
1回目のループ1101(2) & 1 = 1 ans = ans*2 ; N>>1 = 110(2)
2回目のループ110(2) & 1 = 0 ans = ans; N>>1 = 11(2)
3回目のループ11(2) & 1 = 1 ans = ans*(2^4); N>>1 = 1(2)
4回目のループ1(2) & 1 = 1 ans = ans*(2^8); N>>1 = 0(2)
A B M
・A^B(mod M)
の値を 1 行で出力してください。
・また、出力の末尾には改行を入れてください。
・1 ≦ A , B , M ≦ 100,000
2 5 7
4
538 3875 28474
13218