ABC298 D問題 Writing a Numeral

atcoder.jp

各クエリで S を数とみなした値を更新していきます。
クエリ1は、値を10倍して xを加えます。
クエリ2は、先頭の数字に 10^k (k=桁数-1)をかけた値を引きます。
このクエリのために、追加する数字を配列に記録することと、 10^k (k=1,2,\cdots)をあらかじめ計算しておきます。
それぞれの値は、mod 998244353 での値とします。
クエリ3は、更新している値をそのまま出力するだけです。


コード例 (Julia)

_MOD = 998244353

function solve()

  # 入力
  readInts() =  parse.(Int,split(readline()))
  readInt()  =  parse(Int,readline())

  Q = readInt()

  ord = zeros(Int,600001)   # 10^N
  ord[1] = 1
  for i = 1:600000
    ord[i+1] = (ord[i] * 10) % _MOD
  end

  S = zeros(Int,600001)
  S[1] = 1
  ans = 1
  head = 1
  tail = 2

  for q = 1:Q
    A = readInts()
    if A[1] == 1
      x = A[2]
      ans = (ans * 10 + x) % _MOD
      S[tail] = x
      tail += 1
    elseif A[1] == 2
      n = tail - head
      a = (ord[n] * S[head]) % _MOD
      ans -= a
      if ans < 0
        ans += _MOD
      end
      head += 1
    elseif A[1] == 3
      println(ans)
    end
  end

end  # function solve

# main
solve()