# editorial

N = int(eval(input()))



from functools import lru_cache

@lru_cache(maxsize=1000)

def dfs(s):

    if int(s) > N:

        return 0

    ret = 1 if  all(s.count(c) for c in "753") else 0

    for c in "753": #文字列数値をforで回すときの書き方！ 覚える

        ret += dfs(s+c) #pythonなのでそのまま+できる

    return ret



print((dfs("0")))
# editorial

N = int(eval(input()))



#from functools import lru_cache

#@lru_cache(maxsize=1000)

def dfs(s):

    if int(s) > N:

        return 0

    ret = 1 if  all(s.count(c) for c in "753") else 0

    for c in "753": #文字列数値をforで回すときの書き方！ 覚える

        ret += dfs(s+c) #pythonなのでそのまま+できる

    return ret



print((dfs("0")))
# editorial
N = int(eval(input()))
from functools import lru_cache


@lru_cache(maxsize=1000)
def dfs(s):
    if int(s) > N:
        return 0
    ret = 1 if all(s.count(c) for c in "753") else 0
    for c in "753":  # 文字列数値をforで回すときの書き方！ 覚える
        ret += dfs(s + c)  # pythonなのでそのまま+できる
    return ret


print((dfs("0")))

# editorial
N = int(eval(input()))
# from functools import lru_cache
# @lru_cache(maxsize=1000)
def dfs(s):
    if int(s) > N:
        return 0
    ret = 1 if all(s.count(c) for c in "753") else 0
    for c in "753":  # 文字列数値をforで回すときの書き方！ 覚える
        ret += dfs(s + c)  # pythonなのでそのまま+できる
    return ret


print((dfs("0")))

-from functools import lru_cache - - -@lru_cache(maxsize=1000) +# from functools import lru_cache +# @lru_cache(maxsize=1000)