E - Simple Division Editorial by evima


公式解説の前の方の内容をまとめると、求めたいものは \(N = \displaystyle \sum_{i=1}^{K} c_i \times \frac{10^{l_i}-1}{9} \times 10^{\sum_{j=i+1}^{K} l_j}\)\(10007M\) で割った余り \(r\) であり、\(\lfloor r / M \rfloor\) が答えです。ここで、\(r\) は「\(9N = \displaystyle \sum_{i=1}^{K} c_i \times (10^{l_i}-1) \times 10^{\sum_{j=i+1}^{K} l_j}\)\(9×10007M\)で割った余り」を \(9\) で割った商に一致します。よって、\(10\) の累乗を \(9×10007M\) で割った余りが高速に求められればよく、これは言語によっては標準ライブラリの関数で行えます。(ただし、この場合もけっきょく標準ライブラリの中でダブリングなどの処理を行うことになります。)

実装例(Python)

K, M = map(int, input().split())
mod = 9 * 10007 * M
c, l = [0] * K, [0] * K
for i in range(K):
    c[i], l[i] = map(int, input().split())
ans, s = 0, 0
for i in range(K - 1, -1, -1):
    ans += c[i] * (pow(10, l[i], mod) - 1) * pow(10, s, mod)
    s += l[i]
print(ans % mod // 9 // M)

posted:
last update: