/*“In this world, everything is governed by balance.
 There's what you stand to gain and what you stand to lose.
 And when you think you've got nothing to lose,
  you become overconfident.”*/
  
  //i can................ 
  
  /*
  The will to win,
   the desire to succeed,
    the urge to reach your full potential... 
  these are the keys that will unlock the door to personal excellence.
  */

#include<bits/stdc++.h>
#define ll long long int
#define pb push_back
#define pob pop_back
#define vi vector<ll>
#define mp make_pair
#define sz size()
#define rep1(i,n) for(ll i=1;i<=n;i++)
#define rep(i,n) for(ll i=0;i<n;i++)
#define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define maxx 10000005
#define se second
#define fi first
#define edge pair<ll,ll>
#define mod 1000000007
using namespace std;
 
 //ttl=1<<n;   2^n
 //n>>=1;      n/2
 
// ¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++¦¦¦++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++¦¦¦¦¦¦¦¦¦¦+++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++¦¦¦¦¦+++++++¦++¦¦
// ¦¦¦¦¦¦¦¦++¦¦¦¦¦¦++++++¦¦¦¦+++++++++++++¦
// ¦¦¦¦¦¦¦++++++¦¦¦++++++¦¦++++++++++++++¦¦
// ¦¦¦¦¦¦¦+++++++¦¦¦+++++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++¦¦¦¦¦¦¦¦¦++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++¦¦¦¦¦¦¦¦+++++++¦ 
// ¦¦¦¦¦¦¦¦¦¦++¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦++++¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦ 
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++++++++++¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++¦¦+¦++¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++¦¦+++++¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+¦¦¦¦+++¦¦¦¦++++++¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++¦¦+¦¦¦¦¦+++++++¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++++++++++¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++++++++++¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++++¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+¦¦¦+++++++++++¦¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦+++++++++¦¦¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++++¦¦¦¦¦¦¦¦¦¦
// ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦++++++¦¦¦¦¦¦¦¦¦¦¦¦

//ll dp[maxx];
//ll par[maxx];

//vector<ll>v;
//sqrt(n)
/*
bool isprime(ll n)
{
    if(n==1)
    return false;
    for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        return false;
    }
    return true;
}
*/
////////////////////////////////////////////sieve/////////////////////////////////////////////////////
/*
void sieve()
{
    ll n=1000000;
        ll i;
    ll prime[n+1]={0};    
    ll j;
    prime[1]=1;
    prime[0]=1;
    for(i=2;i*i<=n;i++)
    {
        if(prime[i]==0)
        {
            for(j=2*i;j<=n;j=j+i)
            {
                prime[j]=1;
            }
        }
    }
    ll cnt=0;
    for(i=0;i<=n;i++)
    {
        if(prime[i]==0)
        cnt++;
        
        if(prime[cnt]==0)
        pp[i]=1;
        else
        pp[i]=0;
    }
    for(i=1;i<=n;i++)
    {
        pp[i]+=pp[i-1];
    }

}*/    




//map<ll,ll>f;
//map<pair<ll,ll>,ll>m;


////////////////////////////////////////////////matrix power///////////////////////////////////////////////////
/*ll ar[2][2];
ll I[2][2];


void mul(ll A[][2],ll B[][2],ll m)
{
    ll res[m+1][m+1];
    rep(i,m)
    {
        rep(j,m)
        {
            res[i][j]=0;
            rep(k,m)
            {
                res[i][j]=res[i][j]%mod;
                res[i][j]+=(A[i][k]*B[k][j])%mod;
                res[i][j]=res[i][j]%mod;
            }
            
        }
    }
    rep(i,m)
    {
        rep(j,m)
        {
            A[i][j]=res[i][j];
        }
    }
}

void power(ll a[][2],ll m,ll n)
{
    rep(i,m)rep(j,m)
    {
        if(i==j)
        I[i][j]=1;
        else
        I[i][j]=0;
    }
    
    while(n)
    {
        if(n%2)
        {
            //I=I*a;
            mul(I,a,2);
            n--;    
        }
        else
        {
            //a=a*a;
            mul(a,a,2);
            n/=2;
        }    
    }
    
    rep(i,m)
    {
        rep(j,m)
        {
            a[i][j]=I[i][j];
        }
    }
}
/*
void print(ll a[][maxx],ll m)
{
    rep(i,m)
    {
        rep(j,m)
        {
            cout<<(a[i][j])%mod<<" ";
        }
        cout<<endl;
    }
}
*/


int main()
{
	string s;
	cin>>s;
	ll n;
	n=s.size();
	ll i;
	ll m=2019;
	vector<ll>v(2019);
	v[0]=1;
	ll x=1;
	ll ans=0;
	ll r=0;
	for(i=n-1;i>=0;i--)
	{
		r=(r+(s[i]-'0')*x)%m;
		r=r%m;
		x=(x*10)%m;
		ans+=v[r];
		v[r]++;
	}
	cout<<ans<<endl;
	return 0;	
} 	
    
//cout<<"YES"<<endl;

//cout<<"NO"<<endl;


Measured memory_bytes: 3704