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 C# (Mono-mcs 6.8.0.105) (judge verdict: Time Limit Exceeded)

using System;
using System.Linq;
using System.Collections;
namespace D
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList t = new ArrayList();
            var tmp = 0;
            var cnt = 1;
            var S = Console.ReadLine();
            while(Math.Log10(tmp) + 1 < 200000 && Math.Log10(tmp) + 1 < S.Length){
                tmp = cnt * 2019;
                if(tmp.ToString().ToCharArray().Select(x=>x).Where(x=>x.Equals('0')).Count() == 0){
                    t.Add(tmp);
                }
                cnt++;
            }
            var result = 0;
            foreach (var item in t)
            {
                var foo = S;
                var tmpresult = new ArrayList();
                for (int i = 0; i < item.ToString().Length; i++)
                {
                    var index = foo.IndexOf(item.ToString(), i);
                    if(index == -1){
                        break;
                    }
                    if(tmpresult.ToArray().Where(x=>(int)x == index).Count() == 0)
                    {
                        tmpresult.Add(index);
                    }
                }
                result += tmpresult.Count;
            }
            Console.WriteLine(result);
            Console.ReadLine();
        }
    }
}