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

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		int M = 10;
		List<long>[] L = new List<long>[M];
		for(int i=0;i<10;i++) L[i] = new List<long>();
		L[0].Add(3);
		L[0].Add(5);
		L[0].Add(7);
		
		for(int i=0;i<M-1;i++){
			foreach(var n in L[i]){
				L[i+1].Add(3 + n * 10);
				L[i+1].Add(5 + n * 10);
				L[i+1].Add(7 + n * 10);
			}
		}
		
		List<long> n357 = new List<long>();
		for(int i=0;i<M;i++){
			foreach(var n in L[i]){
				var hs = new HashSet<long>();
				var v = n;
				while(v > 0){
					hs.Add(v % 10);
					v /= 10;
				}
				if(hs.Count == 3) n357.Add(n);
			}
		}
		
		int cnt = 0;
		foreach(var n in n357){
			if(n <= N) cnt++;
		}
		Console.WriteLine(cnt);
		
		
		
	}
	long N;
	public Sol(){
		N = rl();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}