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++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>  // g++ -std=c++14 -o a a.cpp

using namespace std;

typedef pair<int, int> P;
typedef long long ll;

#define rep(i, n) for(int i = 0; i < (n); i++)
#define repto(i, n) for(int i = 0; i <= (n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007
#define DEBUG(x) cout << #x << ": " << x << endl;

__attribute__((constructor))
void initial() {
    cin.tie(0);
    ios::sync_with_stdio(false);
}

int main() {
    int N;
    cin >> N;
    int target = 357;
    int count = 0;
    while (target <= N) {
        int check = target;
        int c3 = 0;
        int c5 = 0;
        int c7 = 0;
        int ca = 0;
        // DEBUG(target);
        // DEBUG(check);

        int lastDigit = 0;
        int modTry = 0;
        while (check > 0) {
            // DEBUG(check);
            int mod = check % 10;
            if (mod == 3) {
                c3++;
            } else if (mod == 5) {
                c5++;
            } else if (mod == 7) {
                c7++;
            } else {
                ca++;
            }
            modTry++;
            lastDigit = check;
            check = check / 10;
        }
        // DEBUG(modTry);
        // DEBUG(lastDigit);

        if ((ca == 0) &&(c3 > 0 && c5 > 0 && c7 > 0)) {
            // DEBUG(target);
            // DEBUG(c3);
            // DEBUG(c5);
            // DEBUG(c7);
            // DEBUG(ca);
            count++;
        } 
        
        if (!(lastDigit == 3 || lastDigit == 5 || lastDigit == 7)) {
            target += 10 * (modTry);
        } else {
            if (target % 10 == 3) {
                target += 2;
            } else if (target % 10 == 5) {
                target += 2;
            } else if (target % 10 == 7) {
                target += 6;
            }
        }
        

    }

    cout << count << endl;
}