Matsushita's Blog

計算量O(N)をダブリングによってO(logN)にする D: 阿弥陀

問題

D: 阿弥陀 - AtCoder Beginner Contest 013 | AtCoder

満点解法

D回だけループさせ阿弥陀をシュミレーションするという実装もできるがTLEとなる。 よってダブリングによって計算量を小さくする。

ダブリングとは

ダブリングを使ったべき乗計算はこちら。

keita-matsushita.hatenablog.com

これはX10を計算する時に10回ループを回して計算するのではなく。 X10 = X8 * X2 として計算することでXNの時にO(logN)で計算できる。

これをこの問題に適用する。

なぜダブリングが使えるか。どう適用させるか。

ダブリングを実装方法

ダブリングは以下の手順で実装することができる。

阿弥陀くじの操作

今回の問題では、あみだくじのマップはA = {a1, a2, a3, a4, ..., ai, ... , am}で与えられる。これはそれぞれのaiに対してaiとai + 1のインデックスを交換することで阿弥陀の操作ができる。

ソースコード