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++ (GCC 9.2.1) (judge verdict: Accepted)

#include <cstdio>
#include <cstring>
typedef long long lld;
const int BASE = 10;
const int MAXS = 2e5+5;
const int MOD = 2019;
int cnt[MOD];
char S[MAXS];
int ten[MAXS];
int N;

int main() {
  scanf(" %s", S+1);
  N = strlen(S+1);

  ten[0] = 1;
  for (int i = 1; i <= N; ++i) {
    ten[i] = 1LL * BASE * ten[i-1] % MOD;
  }

  for (int i = 0; i < MOD; ++i) {
    cnt[i] = 0;
  }
  cnt[0] = 1;

  lld ret = 0LL;
  int A = 0;
  for (int i = 1; i <= N; ++i) {
    A = (1LL * BASE * A + (S[i] - '0')) % MOD;

    int key = 1LL * ten[N-i] * A % MOD;
    ret += cnt[key];
    ++cnt[key];
  }
  printf("%lld\n", ret);
  return 0;
}