1. paizaラーニングトップ
  2. レベルアップ問題集
  3. ユークリッドの互除法メニュー(言語選択)
  4. 問題一覧 C編
  5. 高速な累乗の計算

ユークリッドの互除法メニューのサムネイル
高速な累乗の計算 (paizaランク C 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

高速に累乗を計算する方法として、繰り返し二乗法というものがあります。
このアルゴリズムは、a の b 乗 (a ^ b) を、 a ^ (2 ^ i) 乗を用いて表すことで計算量を落とすアルゴリズムです。


まず b の 2 進数表現を考えます。b の最下位の桁が 1 かどうかを確認します。

最下位の桁が 1 の場合、 a を ans にかけます。

この処理が終わったら、a を a の 2 乗に置き換え、b を右に 1 ビットシフト(割る 2)します。


これを b が 0 以下になるまで繰り返すことで、i 回目のときに、a ^ (2 ^ (i - 1)) のかけ算を行うことができます。



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) を求めましょう。

入力される値

A B M


・1 行で、整数 A , B , M が半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

A^B(mod M) の値を 1 行で出力してください。
・また、出力の末尾には改行を入れてください。

条件

・1 ≦ A , B , M ≦ 100,000

入力例1

2 5 7

出力例1

4

入力例2

538 3875 28474

出力例2

13218

問題一覧へ戻る

ページの先頭へ戻る