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 C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;

namespace ABC114C
{
    static class MainClass
    {

        public static void Main(string[] args)
        {


            string N = Console.ReadLine();

            var anslist = Dfs(int.Parse(N), 0);

            int ans = 0;
            string tmpstr;
            foreach(int item in anslist)
            {
                tmpstr = item.ToString();
                if (tmpstr.IndexOf('3')>=0 && tmpstr.IndexOf('5') >= 0 && tmpstr.IndexOf('7') >= 0)
                {

                    ans++;
                }
            }



            Console.WriteLine(ans);

            return;


        }


        public static List<int> Dfs(int upper, int st)
        {
            var anslist = new List<int>();
            var tmplist = new List<int>();
            if (st > upper)
            {
                return anslist;
            }

            int tmp = 0;
            int[] sft = new int[3] { 3, 5, 7 };
            foreach (int item in sft)
            {
                tmp = st * 10 + item;
                if ( tmp > upper)
                {
                    return anslist;
                }
                anslist.Add(tmp);
                tmplist = Dfs(upper, tmp);
                foreach(int tmpitem in tmplist)
                {
                    anslist.Add(tmpitem);
                }
            }
            return anslist;

        }


        public static long Gcd(long a, long b)
        {
            long tmp;
            // a<bにする
            if (a >= b)
            {
                tmp = a;
                a = b;
                b = tmp;
            }

            if (a == 0)
            {
                return b;
            }

            tmp = a;
            a = b % a;
            b = tmp;
            return Gcd(a, b);

        }


        public static IEnumerable<long> PF(long n)
        {
            long i = 2;
            long tmp = n;

            while (i * i <= n) //※1
            {
                if (tmp % i == 0)
                {
                    tmp /= i;
                    yield return i;
                }
                else
                {
                    i++;
                }
            }
            if (tmp != 1) yield return tmp;//最後の素数も返す
        }




    }

}