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.Diagnostics;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args) {
#if DEBUG
        MyDebugger.Test(process, "../TextFile1.txt");
        //MyDebugger.Test(process, "../TextFile2.txt");
        //MyDebugger.MakeTestCase("../TextFile2.txt");
#else
        object ret = process(new StreamReader(Console.OpenStandardInput()));
        Console.WriteLine(ret);
#endif
    }

    static object process(TextReader input) {
        var n = long.Parse(input.ReadLine());

        if (n <= 99) return 0;

        var ns = n.ToString();
        var keta = ns.Count();

        var tbl = new List<int>[keta+1][];
        for (int i = 0; i < tbl.Length; i++) {
            tbl[i] = new List<int>[7];
            tbl[i][0] = new List<int>(); //753
            tbl[i][1] = new List<int>(); //75
            tbl[i][2] = new List<int>(); //73
            tbl[i][3] = new List<int>(); //53
            tbl[i][4] = new List<int>(); //7
            tbl[i][5] = new List<int>(); //5
            tbl[i][6] = new List<int>(); //3
        }

        tbl[1][0] = new List<int>() { };
        tbl[1][1] = new List<int>() { };
        tbl[1][2] = new List<int>() { };
        tbl[1][3] = new List<int>() { };
        tbl[1][4] = new List<int>() { 7 };
        tbl[1][5] = new List<int>() { 5 };
        tbl[1][6] = new List<int>() { 3 };

        Action<List<int>, int> addIf = (l, x) => {
            if (x <= n) l.Add(x);
        };

        for(int i=2; i<=keta; i++) {
            var po = (int)Math.Pow(10, i-1);

            foreach (var pre in tbl[i - 1][0]) {
                addIf(tbl[i][0], pre + 3 * po);
                addIf(tbl[i][0], pre + 5 * po);
                addIf(tbl[i][0], pre + 7 * po);
            }
            foreach (var pre in tbl[i - 1][1]) {
                addIf(tbl[i][0], pre + 3 * po);
                addIf(tbl[i][1], pre + 5 * po);
                addIf(tbl[i][1], pre + 7 * po);
            }
            foreach (var pre in tbl[i - 1][2]) {
                addIf(tbl[i][2], pre + 3 * po);
                addIf(tbl[i][0], pre + 5 * po);
                addIf(tbl[i][2], pre + 7 * po);
            }
            foreach (var pre in tbl[i - 1][3]) {
                addIf(tbl[i][3], pre + 3 * po);
                addIf(tbl[i][3], pre + 5 * po);
                addIf(tbl[i][0], pre + 7 * po);
            }
            foreach (var pre in tbl[i - 1][4]) {
                addIf(tbl[i][2], pre + 3 * po);
                addIf(tbl[i][1], pre + 5 * po);
                addIf(tbl[i][4], pre + 7 * po);
            }
            foreach (var pre in tbl[i - 1][5]) {
                addIf(tbl[i][3], pre + 3 * po);
                addIf(tbl[i][5], pre + 5 * po);
                addIf(tbl[i][1], pre + 7 * po);
            }
            foreach (var pre in tbl[i - 1][6]) {
                addIf(tbl[i][6], pre + 3 * po);
                addIf(tbl[i][3], pre + 5 * po);
                addIf(tbl[i][2], pre + 7 * po);
            }
        }

        var c = 0L;
        foreach(var rec in tbl) {
            c += rec[0].Count;
        }

        return c;
    }
}