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 Rust (1.42.0) (judge verdict: Accepted)

#![allow(non_snake_case, dead_code)]
use proconio::input;
use proconio::marker::Chars;
//use std::collections::HashSet;
//use std::cmp::*;

fn main() {
    input! {
        chars: Chars
    }
    let m = 2019;
    let mut nums: Vec<i32> = Vec::with_capacity(chars.len());
    let l = chars.len();
    for c in chars {
        nums.push(c as i32 - 48);
    }
    nums.reverse();

    // 左からnum[i]までを取った時のあまり。
    let mut amari: Vec<i32> = vec![0; l];
    let mut num_of_amari: Vec<i32> = vec![0; 2019];
    amari[0] = nums[0];
    num_of_amari[amari[0] as usize] += 1;
    let mut tenth: Vec<i32> = vec![0; l];
    tenth[0] = 1;
    for i in 1..l {
        tenth[i] = tenth[i - 1] * 10 % 2019;

        amari[i] = (amari[i - 1] + nums[i] * tenth[i]) % m;
        num_of_amari[amari[i] as usize] += 1;
        //println!("amari[{}]={}", i, amari[i]);
    }

    let mut ans = 0;
    for n in &num_of_amari {
        ans += n * (n - 1) / 2;
    }
    ans += num_of_amari[0];
    println!("{}", ans);
}