#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define pii pair<int, int>
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef CB
freopen("be2.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
int a[80][10] = {};
int b[80][10] = {};
a[0][0] = 1;
b[0][0] = 1;
for (int i = 1; i < 80; i++) {
for (int j = 0; j < 10; j++) {
a[i][j] += a[i - 1][j];
for (int k = 0; k < j; k++) {
a[i][j] += a[i - 1][k];
b[i][j] += a[i - 1][k];
}
}
}
string S;
cin >> S;
int N = S.size();
S += '1';
for (char& c : S) {
c -= '0';
}
int ans = 0;
// last max is i
for (int i = 0; i < N && (i == 0 || S[i] >= S[i - 1]); i++) {
// top is i
// S[i + 1] = j
for (int j = 0; j < S[i] && j < S[i + 1]; j++) {
ans += a[N - (i + 1)][j];
}
if (S[i + 1] < S[i]) {
// last max is actually j
for (int j = i + 1; j < N && S[j] <= S[j - 1]; j++) {
for (int k = 0; k <= S[j] && k < S[j + 1]; k++) {
ans += a[N - (j + 1)][k];
}
}
}
// S[i + 1] = j
for (int j = S[i]; j < S[i + 1]; j++) {
// top is i + 1
ans += b[N - (i + 1)][j];
// top is k
for (int k = i + 2; k < N; k++) {
// S[k] = l
for (int l = j; l < 10; l++) {
ans += a[k - (i + 1)][l - j] * b[N - k][l];
}
}
}
}
// S[0] is already not max
// S[0] is i
for (int i = 0; i < S[0]; i++) {
// top is 0
ans += b[N][i];
// top is j
for (int j = 1; j < N; j++) {
// S[j] = k
for (int k = i; k < 10; k++) {
ans += a[j][k - i] * b[N - j][k];
}
}
}
ans++;
int j = 0;
while (j < N && (j == 0 || S[j] >= S[j - 1])) j++;
while (j < N && (j == 0 || S[j] <= S[j - 1])) j++;
ans -= j == N;
cout << ans << '\n';
return 0;
}