#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <stack>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <stdio.h>
#include <math.h>

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef vector<vector<int>> vvi;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<string>> vvs;
typedef vector<ll> vll;

typedef pair<int, int> pii;

typedef queue<int> qi;
typedef queue<string> qs;


#define rep(i, n) for(int i=0; i<(n); ++i)
#define repp(i, a, b) for(int i = (a); i <= (b); i++)
#define repm(i, a, b) for(int i = (a); i >= (b); i--)

#define all(v) v.begin(), v.end()
//sort( all(v) )　などと使える




int main(){
    string s;
    cin >> s;

    ll n = s.size();

    //割ったあまりがいくつあるか？をまとめておく
    map<int, ll> mod_map;
    mod_map[0]++;


    ll sum = 0;
    ll base = 1;
    rep(i, n){
        //「右から」i桁目をll_s_iにもってくる
        //char => ll に変換している
        char char_s_i = s[n-1-i];
        ll  ll_s_i = char_s_i - '0';

        //300000000000とか
        ll ll_s_i_keta = ll_s_i * base;
        ll_s_i_keta %= 2019; 

        //sum += ll_s_i * base;
        sum += ll_s_i_keta;

        sum %= 2019;

        int r = sum;
        mod_map[r]++;

        base *= 10;
        base %= 2019;
    }

    ll cnt = 0;
    rep(i, 2019){
        ll m = mod_map[i];
        cnt += m*(m-1)/2;
    }

    cout << cnt << endl;
}