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 Go (1.6) (judge verdict: Accepted)

package main

import "math"
import "strings"
import "fmt"
import "strconv"

func main(){    
    var N int
    fmt.Scanf("%d", &N)

    digit := int(math.Floor(math.Log10(float64(N)))) + 1
    //fmt.Printf("digit -> %d\n", digit)
    numStrs := make([]string, 0)
    for i:=3; i<=digit; i++ {
        nums := gen753NumStrs(i)
        numStrs = append(numStrs, nums...)
    }
    /*
    for _, t := range numStrs{
        fmt.Printf("%s\n", t)
    }
    */
    count :=0 
    for _, str := range numStrs {
        if strings.Contains(str, "3") && strings.Contains(str, "5") && strings.Contains(str, "7") {
            num, _ := strconv.Atoi(str)
            if num <= N {
                //fmt.Printf("num -> %d\n", num)
                count += 1
            }
        }
    }

    fmt.Printf("%d\n", count)
}

var NUMS753 = []string{"3", "5", "7"}

func gen753NumStrs(digit int) []string{
    if digit == 1 {
        return NUMS753
    }

    strs := make([]string, 0)
    preStrs := gen753NumStrs(digit - 1)
    for _, preStr := range preStrs {
        for _, s := range NUMS753 {
            str := s + preStr
            strs = append(strs, str)
        }
        
    }
    return strs
}