#![allow(
    non_snake_case,
    unused_variables,
    unused_assignments,
    unused_mut,
    unused_imports,
    dead_code
)]
//use permutohedron::LexicalPermutation as _;
use proconio::{fastout, input, marker::*};
use std::collections::*;
//use std::cmp::*;
//use std::num;
//use petgraph::unionfind::UnionFind;

#[fastout()]
fn main() {
    input! {
        N:i64
    }
    let mut n = N.clone();
    let mut S = Vec::with_capacity(10);
    while n > 0 {
        S.push(N % 10);
        n = n / 10;
    }
    let l = S.len();
    let mut A = vec![0; l];
    A[0] = 7;
    A[1] = 5;
    A[2] = 3;
    if N < 357 {
        println!("0");
        return;
    }
    let mut ans = 0;
    let mut m = 3;
    //println!("n={}", N);
    while m <= N {
        //  println!("A={:?},m={}", A, m);
        ans += 1;
        match next(A) {
            Some((B, c)) => {
                A = B;
                m = c
            }
            None => break,
        };
    }
    println!("{}", ans);
}
fn next(X: Vec<i64>) -> Option<(Vec<i64>, i64)> {
    let mut max_flag = true;
    let mut A = X.clone();
    for i in 0..A.len() {
        if A[i] == 3 || A[i] == 5 {
            A[i] = A[i] + 2;
            max_flag = false;
            break;
        } else if A[i] == 7 {
            A[i] = 3;
        } else {
            // A[i] == 0
            A[i] = 3;
            max_flag = false;
            break;
        }
    }
    if max_flag {
        return None;
    }
    let mut sevens = 0;
    let mut fives = 0;
    let mut threes = 0;
    for i in 0..A.len() {
        match A[i] {
            3 => threes += 1,
            5 => fives += 1,
            7 => sevens += 1,
            _ => (),
        };
    }
    if sevens == 0 || fives == 0 || threes == 0 {
        return next(A);
    }
    let mut ans = 0;
    for i in 0..A.len() {
        ans += A[i] * 10i64.pow(i as u32);
    }
    Some((A, ans))
}
