//dp[桁][mod 10000][prefixがNと一致しているか][ごちうさ数だと確定したか] = 個数すれば良い。
//一見、dp[桁][51?3のうち何文字とマッチしたか？][(同様なので略)]でできそうに見えるが、マッチしなかったときの遷移が、これだけでは一意に定まらないので
//できない。例えば、(N=999999で) 515153をチェックするとき「515」までマッチするが次の「1」でマッチしない。しかし、次は「51」までマッチした状態から始める必要がある。
//一方で、513153をチェックするとき「515」までマッチするが次の「5」でマッチしない。この場合は、次は「ノーマッチ」の状態から始める必要がある。(↑と状態を同一視できないことが分かる。）

#include <iostream>
#include <string>
#define rep(i, n) for (i = 0; i < n; i++)
#define int long long
using namespace std;

bool check(int x) { if (x / 1000 == 5 && (x % 1000) / 100 == 1 && x % 10 == 3) return true; return false; }
string s;
int dp[19][10000][2][2];

signed main() {
	int i, j, k, l, m;
	
	cin >> s;
	dp[0][0][1][0] = 1;
	
	rep(i, s.length()) {
		rep(j, 10000) {
			rep(k, 2) {
				rep(l, 2) {
					rep(m, 10) {
						if (k == 1 && m > s[i] - '0') break;
						dp[i + 1][(j * 10 + m) % 10000][k && (m == s[i] - '0')][l || check((j * 10 + m) % 10000)] += dp[i][j][k][l];
					}
				}
			}
		}
	}
	
	int ans = 0;
	rep(j, 10000) rep(k, 2) ans += dp[s.length()][j][k][1];
	cout << ans << endl;
	return 0;
}
