ABC228E - Integer Sequence Fair

考え方

\begin{aligned}
M^{K^{N}} \pmod{998244353}
\end{aligned}
を計算せよ,という問題.

$x^{n}$の形なら繰り返し二乗法で計算できるので,この形に持っていくことを考える.

logなんかをとっても上手くいくはずがない.

$p = 998244353$は素数だから,「フェルマーの小定理」を考えるのが自然.つまり,$p$の倍数出ない整数$a$に対して

\begin{aligned}
a^{p-1} \equiv 1 \pmod{p}
\end{aligned}
が成り立つ.$p \mid M$である場合は,$M^{K^{N}} \equiv 0 \pmod{998244353}$になるから,はじめに弾いておく.

$M^{p-1} \equiv 1 \pmod{p}$をつくりたいので,$K^{N} \div p$を計算し,商を$q$,剰余を$r$とする.つまり,

\begin{aligned}
K^{N} = q (p - 1) + r
\end{aligned}
とすれば
\begin{aligned}
M^{K^{N}} \equiv M^{r} \pmod{p}
\end{aligned}
となる.これは「繰り返し二乗法」で計算できる形である.

$r$をどうやって求めるかが問題だが,上式の意味するところは

\begin{aligned}
r \equiv K^{N} \pmod{p-1}
\end{aligned}
であり,これも「繰り返し二乗法」で計算できる形になっている.

回答例

N, K, M = map(int, input().split())
p = 998244353

if M % p == 0:
  exit(print(0))
  
r = pow(K, N, p - 1)
print(pow(M, r, p))