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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)


import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String [] args) {
        final Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        int[] kinds = new int[10];
        kinds[3] = 6;
        kinds[4] = 36;
        kinds[5] = 150;
        kinds[6] = 540;
        kinds[7] = 1806;
        kinds[8] = 5796;

        int length = 0;
        if (n < 357) {
            System.out.println(0);
            return;
        }
        String str = String.valueOf(n);
        length = str.length();
     //   System.out.println("length: " + length);

        int sum = 0;
        for (int i = 0 ; i <= length - 1; ++i) {
            sum += kinds[i];
        }
      //  System.out.println("sum: " + sum);
        Set<String> result = new HashSet<>();
        result.add("");

        sum += calculate(str, false, 0, result);
        System.out.println(sum);
    }

    public static int calculate(String str, boolean isSmaller, int pos, Set<String> results) {
    //    System.out.println("pos: " + pos);

        if (pos == str.length()) {
            int kinds = 0;
            for (String result : results) {
      //          System.out.println("result: " + result);
                if (result.contains("3") && result.contains("5") && result.contains("7")) {
                    ++kinds;
                }
            }
            return kinds;
        }

        if (isSmaller) {
            Set<String> newResults = new HashSet<>();
            for (String result : results) {
                newResults.add(result + '3');
                newResults.add(result + '5');
                newResults.add(result + '7');
            }
            return calculate(str, true, pos + 1, newResults);
        } else {
            if (str.charAt(pos) <= '4') {
                Set<String> newResult = new HashSet<>();
                for (String result : results) {
                    newResult.add(result + '3');
                }
                return calculate(str, str.charAt(pos) > '3', pos + 1, newResult);
            } else if (str.charAt(pos) <= '6') {
                Set<String> newResults1 = new HashSet<>();
                for (String result : results) {
                    newResults1.add(result + "3");
                }
                int firstSum = calculate(str, str.charAt(pos) > '3', pos + 1, newResults1);

                Set<String> newResults2 = new HashSet<>();
                for (String result : results) {
                    newResults2.add(result + "5");
                }
                int secondSum = calculate(str, str.charAt(pos) > '5', pos + 1, newResults2);
                return firstSum + secondSum;
            } else {
                Set<String> newResults1 = new HashSet<>();
                for (String result : results) {
                    newResults1.add(result + "3");
                    newResults1.add(result + "5");
                }
                int firstSum = calculate(str, true, pos + 1, newResults1);

                Set<String> newResults2 = new HashSet<>();
                for (String result : results) {
                    newResults2.add(result + "7");
                }
                int secondSum = calculate(str, str.charAt(pos) > '7', pos + 1, newResults2);
                return firstSum + secondSum;
            }
        }
    }
}