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++ (GCC 9.2.1) (judge verdict: Accepted)

// 7/4
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
using ll = long long;
// using P = pair<int, int>;

int dp[15][2][2][2][2];  // 桁数、smaller、3、5、7
int P[3] = {3, 5, 7};

int main() {
    string N;
    cin >> N;
    vector<int> n;
    for (auto a : N) {
        n.push_back(a - '0');
    }
    int l = n.size();

    rep(i, 12) rep(smaller, 2) rep(x, 2) rep(y, 2) rep(z, 2) dp[i][smaller][x][y][z] = 0;
    dp[0][0][0][0][0] = 1;

    rep(i, l) {
        dp[i+1][1][0][0][0] += (dp[i][0][0][0][0] + dp[i][1][0][0][0]);

        rep(smaller, 2) {
            // if (smaller == 0)
            
            // x = 0の時
            // dp[i+1][smaller][0][0][0] += dp[i][smaller][0][0][0];

            rep(x, 2) rep(y, 2) rep(z, 2) {
                // for (int k = 0; P[k] <= (smaller ? 9 : n[i]); k++) {
                for (int k = 0; k < 3; k++) {
                    if (smaller == 0 && P[k] > n[i]) continue;
                    dp[i+1][smaller || P[k] < n[i]][x || P[k] == 3][y || P[k] == 5][z || P[k] == 7] += dp[i][smaller][x][y][z];
                }
            }
        }
    }

    // rep(i, l) {
    //     printf("dp[%d] = %d\n", i+1, dp[i+1][0][1][1][1] + dp[i+1][1][1][1][1]);
    // }

    cout << dp[l][0][1][1][1] + dp[l][1][1][1][1] << endl;
    return 0;
}