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