Problem:
Score : 300 points

Problem Statement

You are given an integer N. Among the integers between 1 and N (inclusive), how many Shichi-Go-San numbers (literally "Seven-Five-Three numbers") are there?

Here, a Shichi-Go-San number is a positive integer that satisfies the following condition:

When the number is written in base ten, each of the digits 7, 5 and 3 appears at least once, and the other digits never appear.

Constraints

1 \leq N < 10^9

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the number of the Shichi-Go-San numbers between 1 and N (inclusive).

Sample Input 1

575

Sample Output 1

4

There are four Shichi-Go-San numbers not greater than 575: 357, 375, 537 and 573.

Sample Input 2

3600

Sample Output 2

13

There are 13 Shichi-Go-San numbers not greater than 3600: the above four numbers, 735, 753, 3357, 3375, 3537, 3557, 3573, 3575 and 3577.

Sample Input 3

999999999

Sample Output 3

26484

Solution in Rust (1.15.1) (judge verdict: Accepted)

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn main() {
    let s: String = read();
    let s = s.chars().collect::<Vec<_>>();
    let mut dp = vec![vec![vec![vec![vec![vec![vec![0; 3]; 2]; 2]; 2]; 2]; 2]; s.len() + 1];

    dp[0][0][0][0][0][0][0] = 1;
    for i in 0..s.len() {
        for j in 0..2 {
            for k in 0..2 {
                for l in 0..2 {
                    for m in 0..2 {
                        for mm in 0..2 {
                            for mmm in 0..3 {
                                let lim = if j == 1 { 9 } else { s[i].to_digit(10).unwrap() };
                                for d in 0..lim + 1 {
                                    let idx1 = if j == 1 || d < lim { 1 } else { 0 };
                                    let idx2 = if k == 1 || d == 3 { 1 } else { 0 };
                                    let idx3 = if l == 1 || d == 5 { 1 } else { 0 };
                                    let idx4 = if m == 1 || d == 7 { 1 } else { 0 };
                                    let idx5 = if mm == 1 || (d != 0 && d != 3 && d != 5 && d != 7) { 1 } else { 0 };
                                    let mut idx6 = 2;
                                    if mmm == 0 && d == 0 {
                                        idx6 = 0;
                                    } else if mmm == 0 && d != 0 {
                                        idx6 = 1;
                                    } else if mmm == 1 && d != 0 {
                                        idx6 = 1;
                                    }
                                    dp[i + 1][idx1][idx2][idx3][idx4][idx5][idx6] += dp[i][j][k][l][m][mm][mmm];
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    let mut ans = 0;
    for j in 0..2 {
        for mmm in 0..2 {
            // println!("{:?}", dp[i][j][1][1][1][0][mmm]);
            ans += dp[s.len()][j][1][1][1][0][mmm];
        }
    }
    println!("{:?}", ans);
}