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
    {
        const int Digits = 9;

        static int Add3(int[] numbers753, ref int index, int digits, int number, int[] _357eachCount)
        {
            ++digits;
            if (digits >= Digits)
            {
                return number;
            }

            int[] _357eachCount_ = new int[3];
            _357eachCount_[0] = _357eachCount[0];
            _357eachCount_[1] = _357eachCount[1];
            _357eachCount_[2] = _357eachCount[2];

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

            ++_357eachCount_[0];

            if (_357eachCount_[0] >= 1 && _357eachCount_[1] >= 1 && _357eachCount_[2] >= 1)
            {
                numbers753[index] = number;

                ++index;
            }

            return Add753(numbers753, ref index, digits, number, _357eachCount_);
        }
        static int Add5(int[] numbers753, ref int index, int digits, int number, int[] _357eachCount)
        {
            ++digits;
            if (digits >= Digits)
            {
                return number;
            }

            int[] _357eachCount_ = new int[3];
            _357eachCount_[0] = _357eachCount[0];
            _357eachCount_[1] = _357eachCount[1];
            _357eachCount_[2] = _357eachCount[2];

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

            ++_357eachCount_[1];

            if (_357eachCount_[0] >= 1 && _357eachCount_[1] >= 1 && _357eachCount_[2] >= 1)
            {
                numbers753[index] = number;

                ++index;
            }

            return Add753(numbers753, ref index, digits, number, _357eachCount_);
        }
        static int Add7(int[] numbers753, ref int index, int digits, int number, int[] _357eachCount)
        {
            ++digits;
            if (digits >= Digits)
            {
                return number;
            }

            int[] _357eachCount_ = new int[3];
            _357eachCount_[0] = _357eachCount[0];
            _357eachCount_[1] = _357eachCount[1];
            _357eachCount_[2] = _357eachCount[2];

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

            ++_357eachCount_[2];

            if (_357eachCount_[0] >= 1 && _357eachCount_[1] >= 1 && _357eachCount_[2] >= 1)
            {

                numbers753[index] = number;

                ++index;
            }

            return Add753(numbers753, ref index, digits, number, _357eachCount_);
        }


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

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

            return number;
        }

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

            int numberCount = 0;
            int numberCount_ = 1;
            for (int j = 1; j <= Digits; ++j)
            {
                numberCount_ *= 3;
                numberCount += numberCount_;
            }

            int[] numbers753 = new int[numberCount];

            int index = 0;
            int digits = -1;
            int[] _357eachCount = new int[3];

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

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

                ++i;
            }

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