#pragma warning(disable:4996)

#include <algorithm>
#include <bitset>
// #include <boost/dynamic_bitset.hpp>
#include <cfloat>
#include <cmath>
#include <ctime>
#include <chrono>
#include <deque>
#include <iomanip>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#define DEBUG(x) cout << #x << ": " << x << endl
#define INFILE() freopen("input.txt", "r", stdin)
#define REP(i, a, b) for (int i = (a); i < (b); i++)
#define REPC(i, a) REP(i, 0, a)
#define RREP(i, a, b) for (int i = (a); i >= (b); i--)
#define RREPC(i, a) RREP(i, a, 0)
#define ALL(s) begin(s), end(s)
#define RALL(s) rbegin(s), rend(s)

using namespace std;

using ll = long long;
using ull = unsigned long long;
using i_i = pair<int, int>;
using ll_i = pair<ll, int>;
using i_ll = pair<int, ll>;
using d_i = pair<double, int>;
using ll_ll = pair<ll, ll>;
using d_d = pair<double, double>;

static constexpr ll LL_MOD = 1000000009;
static constexpr ll LL2_MOD = 1000000007;
static constexpr double EPS = numeric_limits<double>::epsilon();
static constexpr double PI = 3.14159265358979323846264338327950288;

static map<type_index, const char *const> scanType = { { typeid(int), "%d" },
{ typeid(ll), "%lld" },
{ typeid(double), "%lf" },
{ typeid(char), "%c" } };

template <class T> static void scan(vector<T> &v);
static void scan(vector<string> &v, bool isWord = true);
void dfs(int i, const int size, const int range_start, const int range_end);

// static boost::dynamic_bitset<> scan(char trueValue = 'o');

vector<int> buf;
vector<int> nmap = { 3, 5, 7 };

ll count;
int maxN = 0;

int main(int argc, char *argv[]) {
	// INFILE();
	string s;
	cin >> s;
	maxN = stoi(s);
	int size = s.size();
	buf.resize(size);
	for (int i = 1; i <= size; i++)
	{
		buf.resize(i);
		dfs(0, i, 0, 2);
	}

	cout << ::count << endl;
	return 0;
}

template <class T> static void scan(vector<T> &v) {
	auto tFormat = scanType[typeid(T)];
	for (T &n : v) {
		scanf(tFormat, &n);
	}
}

static void scan(vector<string> &v, bool isWord) {
	if (isWord) {
		for (auto &n : v) {
			cin >> n;
		}
		return;
	}

	int i = 0, size = v.size();
	string s;
	getline(cin, s);

	if (s.size() != 0) {
		i++;
		v[0] = s;
	}

	for (; i < size; ++i) {
		getline(cin, v[i]);
	}
}

//static boost::dynamic_bitset<> scan(char trueValue) {
//	string s;
//	getline(cin, s);
//
//	if (s.size() == 0) {
//		getline(cin, s);
//	}
//
//	for_each(begin(s), end(s),
//		[trueValue](char &c) { c = (c == trueValue) ? '1' : '0'; });
//	return boost::dynamic_bitset<>(string(rbegin(s), rend(s)));
//}

void dfs(int i, const int size, const int range_start, const int range_end)
{
	if (i == size) {
		int n = 0;
		vector<bool> checked = { false, false, false };
		for (int i = 0; i < buf.size(); i++) {
			checked[buf[i]] = true;
			n += nmap[buf[i]];
			n *= 10;
		}
		n /= 10;
		if (maxN >= n && checked[0] && checked[1] && checked[2])
		{
			::count++;
		}
	}
	else {
		for (int j = range_start; j <= range_end; ++j) {
			buf[i] = j;
			dfs(i + 1, size, range_start, range_end);
		}
	}
}

Measured memory_bytes: 256