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: