Official

A - Simple Math 2 Editorial by yosupo


例えば以下のようなコード(python3)で問題文の数式を計算することが出来ますが、TLEやMLEが起こります。

print((10 ** n) // m % m)

理由は、 \(10^{N}\) (10 ** n) があまりに大きくなるからです。一般に大きい整数を(誤差なく)扱いたい場合、桁数に比例したメモリが必要になります。

非常に大きい値を扱いたいとき、AtCoderでは \(\bmod 998244353\) で考えることがよくあります。今回も \(10^N\) そのものではなく、なんらかの \(\bmod\) で考えられないでしょうか?

実は、\(10^N\) の代わりに \(10^N \bmod M^2\) を使っても大丈夫です。以下の式変形で、 \(10^N\) から \(M^2\) の倍数を引いても答えが変わらないことを示せます。

\[\lfloor \frac{10^N - kM^2}{M} \rfloor \equiv \lfloor \frac{10^N}{M} - kM \rfloor \equiv \lfloor \frac{10^N}{M} \rfloor - kM \equiv \lfloor \frac{10^N}{M} \rfloor \pmod M (k \in \mathbb{Z})\]

よって最終的には、次のコードで AC することが出来ます。

n, m = map(int, input().split())
print(pow(10, n, m * m) // m % m)

posted:
last update: