Problem:
Score : 400 points

Problem Statement

Given is a string S consisting of digits from 1 through 9.

Find the number of pairs of integers (i,j) (1 ≤ i ≤ j ≤ |S|) that satisfy the following condition:

Condition: In base ten, the i-th through j-th characters of S form an integer that is a multiple of 2019.

Constraints

1 ≤ |S| ≤ 200000

S is a string consisting of digits from 1 through 9.

Input

Input is given from Standard Input in the following format:

S

Output

Print the number of pairs of integers (i,j) (1 ≤ i ≤ j ≤ |S|) that satisfy the condition.

Sample Input 1

1817181712114

Sample Output 1

3

Three pairs - (1,5), (5,9), and (9,13) - satisfy the condition.

Sample Input 2

14282668646

Sample Output 2

2

Sample Input 3

2119

Sample Output 3

0

No pairs satisfy the condition.

Solution in Kotlin (1.3.71) (judge verdict: Time Limit Exceeded)

fun main() {
  val S = readString()
//  val D = Math.min(6, S.length)
//  val D = Math.min(500, S.length)
  val D = S.length

  fun isDividable2019(s: String): Boolean {
    var num = 0
    for (i in s.indices) {
      val n = s[i] - '0'
      num = (num * 10 + n) % 2019
    }
    println("$s -> ${num}")
    return num == 0
  }

  fun f(s: String): Long {
    println(s)
    val size = (s.length + D - 1) / D
    val list = (0 until size).map {
      s.substring(it * D, Math.min((it + 1) * D, s.length))
    }
    val bList = list.map { isDividable2019(it) }
    println(bList)
    var cnt = 0L
    var cNum = 0
    for (i in bList.indices) {
      if (bList[i]) {
        cNum++
        cnt += cNum
      } else {
        cNum = 0
      }
    }
    return cnt
  }

  fun g(s: String): Long {
    var sum = 0L
    var cnt = 0
    var num = 0
    for (i in s.indices) {
      val n = s[i] - '0'
      num = num * 10 + n
      if (num % 2019 == 0) {
        cnt++
        sum += cnt
      }
      num %= 2019
    }
    return sum
  }

  var sum = 0L
  for (i in 0 until D) {
//    sum += f(S.substring(i))
    sum += g(S.substring(i))
  }
  println(sum)
}

fun readString() = readLine()!!
fun readStrings() = readString().split(" ")
fun readInt() = readString().toInt()
fun readInts() = readStrings().map { it.toInt() }