Official

E - Integer Sequence Fair Editorial by leaf1415


審査対象の数列、すなわち「 \(1\) 以上 \(K\) 以下の整数からなる長さ \(N\) の整数列」は \(K^N\) 個あります。
よって「審査対象となる数列それぞれに対して \(1\) 以上 \(M\) 以下の整数の点数を与える方法」は \(M^{(K^N)}\) 通りです。
したがって本問題は、\(M^{(K^N)}\)\(P := 998244353\) で割った余りを求める問題です。

\(M\)\(P\) の倍数のときは \(M^{(K^N)}\)\(P\) の倍数なので、出力すべき値は \(0\) です。
以下では、\(M\)\(P\) の倍数ではないとします。

このとき、\(P\) は素数なのでフェルマーの小定理より

\(M^{P-1} \equiv 1 \pmod{P}\)

が成り立ちます。 よって、\(K^N\)\(P-1\) で割った商を \(q\) 、余りを \(r\) とおくと、

\(M^{(K^N)} = M^{(q(P-1)+r)} = (M^{P-1})^q \times M^r \equiv 1^q \times M^r = M^r \pmod{P}\)

となり、\(M^{(K^N)}\)\(P\) で割った余りは、\(M^r\)\(P\) で割ったあまりと等しいです。
したがって、\(M^{(K^N)}\)\(P\) で割った余りを計算するには

  • \(K^N\)\(P-1\) で割った余り \(r\) と、
  • \(M^r\)\(P\) で割った余り

\(2\) つを計算できれば良いです。 これらはそれぞれ、繰り返し二乗法によって十分高速に計算できます。
計算の過程でオーバーフローが生じないように注意して下さい。

posted:
last update: