#include <malloc.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//ABC164D

int compare_int(const void *a, const void *b) { //sort
  return *(int*) a - *(int*) b;
}
long long gya(long long a) { //逆元を求める
  long long m=1000000007, b=m, u=1, v=0, c, t;
  while(b){
    t=a / b; //何これ
    a-=t * b, u-=t * v; //何これ
    c=a, a=b, b=c, c=u, u=v, v=c; //swap
  }
  return (u + m) % m;
}

long long com(long long b, long long d) { //bCd
  int i, mod=1000000007;
  long long ret=1, re2=1;
  for(i=1; i <= d; i++)
    ret=ret * (b - d + i), re2=re2 * i;
  return ret * gya(re2);
}

int main(void) {
  long long n, k, i, cou=0, tmp, len, mod=2019, mte=1, sum=0;

  char s[200000];
  scanf(" %s", s);

  for(len=0; s[len] != '\0'; ++len)
    ; //文字数
  int m[len + 1];

  m[len - 1]=s[len - 1] - 48;
  m[len]=0;

  for(i=len - 2; i >= 0; i--){
    mte=(mte * 10) % mod;
    m[i]=((s[i] - 48) * mte + m[i + 1]) % mod;
  }

  qsort(m, len + 1, sizeof(int), compare_int); //sort

  for(i=0; i < len; i++){
    if(m[i] == m[i + 1]) cou++;
    else{
      if(cou >= 1) sum+=cou*(cou+1)/2;
      cou=0;
    }

    //printf("%d\n",m[i]);
  }
  printf("%lld", sum);
}
