【AtCoder】「分野別 初中級者が解くべき過去問精選 100 問」解答例【高速なべき乗計算】

この記事は 【AtCoder】初中級者が解くべき過去問精選 100 問を緑色コーダーが C++ で解いてみた の子記事です。お読みになる前に親記事をご確認ください。

AtCoder LibraryModint にはべき乗を計算量 O(\log n) で計算するメンバ関数 pow があります。pow を使って問題を解きます。

70. NTL_1_B – べき乗

剰余演算の法が 10^9 + 7 で固定されているため、AtCoder LibraryModintmodint1000000007 (static_modint<1000000007>) を用います。m を整数型から modint1000000007 型に変換し、pow を使って n 乗を計算すれば答えになります。

計算量は O(\log n) = 10^2 程度です。

71. Square869120Contest #1 E – 散歩

c_{i – 1} から街 c_{i} への移動距離を都度計算する場合、全体の計算量は \Omega(N Q \log (\max_i a_i)) = 10^{12} 程度です。実行時間制限に違反しそうです。

累積和 を用いて街 1 から街 i への移動距離 \mathrm{cost}[i] を計算しておくと、街 c_{i – 1} から街 c_{i} への移動距離は以下の式を使って O(1) で計算できます。

\begin{aligned}
\mathrm{cost}[c_i] – \mathrm{cost}[c_{i – 1}]&& (c_i>c_{i – 1}) \\
\mathrm{cost}[c_{i – 1}] – \mathrm{cost}[c_{i}]&& (c_i<c_{i – 1}) \\
\end{aligned}

i – 1 から街 i を結ぶ道路の長さの計算に O(\log a_i) かかるため、累積和の計算量は O(N \log (\max_i a_i)) です。

全体の計算量は O(N \log (\max_i a_i) + Q) = 10^7 程度です。実行時間制限を満たして解答できます。