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 PyPy3 (2.4.0) (judge verdict: Accepted)

ns = input()

dp = [ [ [0]*8  for _ in range(2) ] for _ in range(len(ns)) ]
# dp[i][small_or_not][exist 7,5,3 (0~7)]

first = int(ns[0])
if first > 7:
    dp[0][1][4] = 1
    dp[0][1][2] = 1
    dp[0][1][1] = 1
elif first == 7:
    dp[0][0][4] = 1
    dp[0][1][2] = 1
    dp[0][1][1] = 1
elif first > 5:
    dp[0][1][2] = 1
    dp[0][1][1] = 1
elif first == 5:
    dp[0][0][2] = 1
    dp[0][1][1] = 1
elif first > 3:
    dp[0][1][1] = 1
elif first == 3:
    dp[0][0][1] = 1
dp[0][1][0] = 1

for i in range(0, len(ns)-1):
    next_num = int(ns[i+1])
    dp[i+1][1][0] += dp[i][1][0] 
    for e753 in range(8):
        dp[i+1][1][e753 | 4] += dp[i][1][e753] 
        dp[i+1][1][e753 | 2] += dp[i][1][e753] 
        dp[i+1][1][e753 | 1] += dp[i][1][e753] 

        if next_num > 7:
            dp[i+1][1][e753 | 4] += dp[i][0][e753] 
        if next_num > 5:
            dp[i+1][1][e753 | 2] += dp[i][0][e753] 
        if next_num > 3:
            dp[i+1][1][e753 | 1] += dp[i][0][e753]

        if next_num == 7:
            dp[i+1][0][e753 | 4] += dp[i][0][e753] 
        if next_num == 5:
            dp[i+1][0][e753 | 2] += dp[i][0][e753] 
        if next_num == 3:
            dp[i+1][0][e753 | 1] += dp[i][0][e753]

print( dp[-1][0][7] + dp[-1][1][7])