#include <bits/stdc++.h>
using namespace std;
template <class T, class U>
void ckmin(T &a, U b) {
  if (a > b) a = b;
}
template <class T, class U>
void ckmax(T &a, U b) {
  if (a < b) a = b;
}
const int MAXN = 100013;
const int DIG = 11;
int N;
int stor[DIG * DIG];
long long dp[2][DIG][DIG];
long long ans;
vector<int> nums;
int sum(int l, int r) { return ((r - l + 1) * (r + l) / 2) % 11; }
int32_t main() {
  cout << fixed << setprecision(12);
  cerr << fixed << setprecision(4);
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  for (auto i = (1); i < (10); i++) {
    nums.push_back(i);
  }
  int iter = 0;
  for (auto i = (10); i < (100); i++) {
    while (nums[iter] < i / 10) iter++;
    if (nums[iter] != i / 10) continue;
    if (i % 10 < (iter + 1) % 11) {
      nums.push_back(i);
    }
  }
  for (auto i = (0); i < (((int)(nums).size())); i++) {
    stor[nums[i]] = (i + 1) % 11;
  }
  string temps;
  cin >> temps;
  N = ((int)(temps).size());
  for (auto i = (1); i < (N); i++) {
    int x = (temps[i] - '0'), y = (temps[i - 1] - '0');
    for (auto j = (0); j < (DIG); j++) {
      for (auto k = (0); k < (DIG); k++) {
        dp[1][j][k] = dp[0][j][k];
        dp[0][j][k] = 0;
      }
    }
    for (auto j = (0); j < (DIG); j++) {
      for (auto k = (x + 1); k < (DIG); k++) {
        if (dp[1][j][k] == 0) continue;
        int num = sum(j + 1, k - 1);
        num += (j - y - 1);
        num += (x + 1);
        num += k;
        num %= DIG;
        if (num < 0) num += DIG;
        dp[0][k][num] += dp[1][j][k];
      }
    }
    if (y != 0 && y > x) {
      dp[0][stor[y]][stor[10 * y + x]]++;
    }
    for (auto j = (0); j < (DIG); j++) {
      for (auto k = (0); k < (DIG); k++) {
        ans += dp[0][j][k];
      }
    }
  }
  for (auto i = (0); i < (N); i++) {
    int x = (temps[i] - '0');
    if (x != 0) {
      ans++;
    }
  }
  cout << ans << '\n';
  return 0;
}
