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: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ABC114_C
{
    class Program
    {
        static int Add3(int[] numbers753, ref int index, int digits, int number, int count3, int count5, int count7)
        {
            ++digits;
            if (digits >= 9)
            {
                return number;
            }

            number += (int)Math.Pow(10, digits) * 3;

            ++count3;

            if (count3 >= 1 && count5 >= 1 && count7 >= 1)
            {
                numbers753[index] = number;

                ++index;
            }

            return Add753(numbers753, ref index, digits, number, count3, count5, count7);
        }
        static int Add5(int[] numbers753, ref int index, int digits, int number, int count3, int count5, int count7)
        {
            ++digits;
            if (digits >= 9)
            {
                return number;
            }

            number += (int)Math.Pow(10, digits) * 5;

            ++count5;

            if (count3 >= 1 && count5 >= 1 && count7 >= 1)
            {
                numbers753[index] = number;

                ++index;
            }

            return Add753(numbers753, ref index, digits, number, count3, count5, count7);
        }
        static int Add7(int[] numbers753, ref int index, int digits, int number, int count3, int count5, int count7)
        {
            ++digits;
            if (digits >= 9)
            {
                return number;
            }

            number += (int)Math.Pow(10, digits) * 7;

            ++count7;

            if (count3 >= 1 && count5 >= 1 && count7 >= 1)
            {

                numbers753[index] = number;

                ++index;
            }

            return Add753(numbers753, ref index, digits, number, count3, count5, count7);
        }


        static int Add753(int[] numbers753, ref int index, int digits, int number, int count3, int count5, int count7)
        {
            int number3 = number;
            int number5 = number;
            int number7 = number;

            number3 = Add3(numbers753, ref index, digits, number, count3, count5, count7);
            number5 = Add5(numbers753, ref index, digits, number, count3, count5, count7);
            number7 = Add7(numbers753, ref index, digits, number, count3, count5, count7);

            return number;
        }

        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());

            int[] numbers753 = new int[49152];

            int index = 0;
            int digits = -1;

            Add753(numbers753, ref index, digits, 0, 0, 0, 0);

            int i = 0;
            int number = 0;
            int count = 0;
            while((number = numbers753[i]) != 0)
            {
                if (n >= number)
                {
                    ++count;
                }

                ++i;
            }

            Console.WriteLine("{0}", count);
        }
    }
}