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# (.NET Core 3.1.201) (judge verdict: Accepted)

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

namespace AtCoder.C
{
    public class Program
    {
        public static void Main() { var r = GetResult(); Debug.WriteLine(r); Console.Write(r); }

        private static object GetResult()
        {
            var N = ReadLong();

            var q = new Queue<Num753>();
            q.Enqueue(new Num753 { Has3 = true, Value = 3 });
            q.Enqueue(new Num753 { Has5 = true, Value = 5 });
            q.Enqueue(new Num753 { Has7 = true, Value = 7 });
            var count = 0;
            while (q.Count > 0)
            {
                var v = q.Dequeue();
                if (v.Value > N) continue;

                if (v.Is753) count++;
                var v3 = v.Clone();
                v3.Value = v3.Value * 10 + 3;
                v3.Has3 = true;
                q.Enqueue(v3);
                var v5 = v.Clone();
                v5.Value = v5.Value * 10 + 5;
                v5.Has5 = true;
                q.Enqueue(v5);
                var v7 = v.Clone();
                v7.Value = v7.Value * 10 + 7;
                v7.Has7 = true;
                q.Enqueue(v7);
            }

            return count;
        }

        #region Console.Read

        public static string ReadText() { return Console.ReadLine(); }
        public static List<string> ReadTexts() { return Console.ReadLine().Split(' ').ToList(); }
        public static long ReadLong() { return long.Parse(Console.ReadLine()); }
        public static (long, long) Read2Longs() { var ls = ReadLongs(); return (ls[0], ls[1]); }
        public static (long, long, long) Read3Longs() { var ls = ReadLongs(); return (ls[0], ls[1], ls[2]); }
        public static (long, long, long, long) Read4Longs() { var ls = ReadLongs(); return (ls[0], ls[1], ls[2], ls[3]); }
        public static (long, long, long, long, long) Read5Longs() { var ls = ReadLongs(); return (ls[0], ls[1], ls[2], ls[3], ls[4]); }
        public static List<long> ReadLongs() { return Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToList(); }

        #endregion
    }
    class Num753
    {
        public bool Has7 { get; set; }
        public bool Has5 { get; set; }
        public bool Has3 { get; set; }
        public bool Is753 { get { return Has3 && Has5 && Has7; } }
        public long Value { get; set; }

        public Num753 Clone()
        {
            return new Num753
            {
                Has7 = Has7,
                Has5 = Has5,
                Has3 = Has3,
                Value = Value,
            };
        }
    }
}