aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc 164 D - Multiple of 2019 (python)

158 E を解いたことがあるのに関わらず、d が解けずに敗戦。a の羊を半分と誤読し続けたせいでパフォも最悪でした。失敗を二つもしたらそうなる。
考え方は int( s[ i: j+1 ] ) が2019の倍数 ⇔ int( s[ i : ] ) - int( s[ j : ] ) %2019= 0
(2019と10が互いに素なので)
として O(n) で探索するというもの。ただしいちいち上記のように s を参照してスライスしていると TLE するので、文字列を後ろから見るたびに 10 をかけていって
c (= int( s[ i : ] ) ) = c (= int( s[ i+1 : ] ) ) + pow(10,n-1-i,2019) * s[ i ] みたい文字列ではなく、文字( c )で値を保存する。

import sys
input = sys.stdin.readline
s = input().strip()
if len(s) <= 3:
  print(0)
  exit()
c = 0
chk = [0]*2019
for i,si in enumerate(s[::-1]):
  c += int(si)*pow(10,i,2019)
  chk[c%2019] += 1
ans = chk[0]
for i in chk:
  ans += i*(i-1)//2