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 AddNumber(int[] numbers753, ref int index, int digits, int number, int _357Index, 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];

            int _357 = 0;
            switch(_357Index)
            {
                case 0: _357 = 3; break;
                case 1: _357 = 5; break;
                case 2: _357 = 7; break;
            }

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

            ++_357eachCount_[_357Index];

            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)
        {
            for (int i = 0; i < 3; ++i)
            {
                AddNumber(numbers753, ref index, digits, number, i, _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);
        }
    }
}