###template###
import sys
def input(): return sys.stdin.readline().rstrip()
def mi(): return map(int, input().split())
###template###

N = input()
digits = len(N)

#DP[0~N][tight][a7ed][a5ed][a3ed]
#最初の添字にNまで許しているのは、全部を選んで「N+1個目を選ぶ」というループで、正誤判定を行えばいいという考えから
#DP[N]~は全て初期から入れてしまうことで、tightの場合に桁の数字を読み込もうとしてindex errorが起きるのを防ぐ
DP = [[[[[-1] * 2 for _ in range(2)] for _ in range(2)] for _ in range(2)] for _ in range(digits+1)]

#正誤判定。これら以外の場合は、「残り必要7,5,3に対して残り桁数が足りない」判定でまかなえるので初期化の必要なし
#いや、残りの2つも最後の3**(digits-digit)でいける... とはいえ計算量削減に繋がりそうなので放っておく
DP[digits][0][1][1][1] = 1
DP[digits][1][1][1][1] = 1

#残りdigitが2以下で7,5,3が一つも出てなければ明らかに無理
#あとは残りdigitが1で2つ残ってるときも
DP[digits-1][0][0][0][0] = 0
DP[digits-1][1][0][0][0] = 0
DP[digits-1][0][1][0][0] = 0
DP[digits-1][0][0][1][0] = 0
DP[digits-1][0][0][0][1] = 0
DP[digits-1][1][1][0][0] = 0
DP[digits-1][1][0][1][0] = 0
DP[digits-1][1][0][0][1] = 0
DP[digits-2][0][0][0][0] = 0
DP[digits-2][1][0][0][0] = 0

#いけるパターン
DP[digits-1][0][1][1][0] = 1
DP[digits-1][0][1][0][1] = 1
DP[digits-1][0][0][1][1] = 1

import sys
sys.setrecursionlimit(10**9)

#(既に探索した桁数、未満フラグ、already7ed, same, same)
#digits-digitで「残り桁数」が見られる
def solve(digit, tight, a7ed, a5ed, a3ed):
  global digits
  #-1じゃなければ~()が値を持つのでifに入り、そのままDPの値を返す。
  #-1(111111..)なら0になるのでelseに入って値を求める
  if ~(DP[digit][tight][a7ed][a5ed][a3ed]):
#    print('already visited',digit, tight, a7ed, a5ed, a3ed,'DPは',DP[digit][tight][a7ed][a5ed][a3ed])
    return DP[digit][tight][a7ed][a5ed][a3ed]
  else: #まだ値が入っていない場合
    if digits-digit < 3-a7ed-a5ed-a3ed:
      DP[digit][tight][a7ed][a5ed][a3ed] = 0
      return 0
    #残り桁数よりも、「7,5,3のうち足りないものの数」が多ければ、753数は無し
    if tight:
#      print('tight',digit, tight, a7ed, a5ed, a3ed)
      target = int(N[digit])
#      print('target=',target)
      #まだ1つも数字を選んでいなければ、0を選ぶパターンがある
      tmp = 0 if a7ed|a5ed|a3ed else solve(digit+1,0,0,0,0)
      if target <= 2: tmp += 0
      elif target == 3: tmp += solve(digit+1, 1, a7ed, a5ed, a3ed | 1)
      elif target == 4: tmp += solve(digit+1, 0, a7ed, a5ed, a3ed | 1)
      elif target == 5: tmp += solve(digit+1, 0, a7ed, a5ed, a3ed | 1) + solve(digit+1, 1, a7ed, a5ed | 1, a3ed)
      elif target == 6: tmp += solve(digit+1, 0, a7ed, a5ed, a3ed | 1) + solve(digit+1, 0, a7ed, a5ed | 1, a3ed)
      elif target == 7: tmp += solve(digit+1, 0, a7ed, a5ed, a3ed | 1) + solve(digit+1, 0, a7ed, a5ed | 1, a3ed) + solve(digit+1, 1, a7ed | 1, a5ed, a3ed)
      else: #8,9の場合
        tmp += solve(digit+1, 0, a7ed, a5ed, a3ed | 1) + solve(digit+1, 0, a7ed, a5ed | 1, a3ed) + solve(digit+1, 0, a7ed | 1, a5ed, a3ed)
      DP[digit][tight][a7ed][a5ed][a3ed] = tmp
      return tmp
    else: #自由！
#      print('not tight',digit, tight, a7ed, a5ed, a3ed, '残り桁数は',digits-digit)
      if a7ed & a5ed & a3ed: #全て1なら
        tmp = 3**(digits-digit) #3^残り桁のパターンがある
        DP[digit][tight][a7ed][a5ed][a3ed] = tmp
        return tmp
      else:
        #一度0を選んだあと、tightではなくなっているが、その後も、まだ1つも数字を選んでいなければ、0を選ぶパターンはありえる
        tmp = 0 if a7ed|a5ed|a3ed else solve(digit+1,0,0,0,0)
        #次の桁は7,5,3のどれか
        tmp += solve(digit+1, 0, a7ed | 1, a5ed, a3ed) + solve(digit+1, 0, a7ed, a5ed | 1, a3ed) + solve(digit+1, 0, a7ed, a5ed, a3ed | 1)
        DP[digit][tight][a7ed][a5ed][a3ed] = tmp
        return tmp

print(solve(0,1,0,0,0))
#print(DP[2][0][0][0][0],DP[1][0][0][0][0], DP[1][0][1][0][0],DP[1][0][0][1][0],DP[1][0][0][0][1])





Measured memory_bytes: 38256