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 JavaScript (node.js v5.12) (judge verdict: Accepted)

var GET = (function(){
  function f(s){return new g(s);}
  function g(s){this._s=s.trim().split("\n");this._y=0;}
  g.prototype.a = function(f){
    var s = this._s, y = this._y, r;
    if(typeof s[y] === "string")s[y]=s[y].split(" ").reverse();
    r = s[y].pop();
    if(!s[y].length)this._y++;
    return f?r:+r;
  }
  g.prototype.l = function(f){
    var s=this._s[this._y++].split(" ");return f?s:s.map(a=>+a);
  }
  g.prototype.m = function(n,f){
    var r=this._s.slice(this._y,this._y+=n).map(a=>a.split(" "));
    return f?r:r.map(a=>a.map(a=>+a));
  }
  g.prototype.r = function(n,f){
    var r = this._s.slice(this._y,this._y+=n);
    return f?r:r.map(a=>+a);
  }
  return f;
})();
var o=GET(require("fs").readFileSync("/dev/stdin","utf8"));

console.log(main());
function main(){
  var n = o.a();
  var t = [5,5,3], ans = 0;
  while(1){
    t = make(t);
    var f = check(t,n);
    if(f === 1)ans++;
    else if(f === -1)break;
  }
  return ans;
  function make(t){
    for(var i = 0; i < t.length; i++){
      if(t[i] === 3){t[i] = 5; break;}
      if(t[i] === 5){t[i] = 7; break;}
      t[i] = 3;
    }
    if(i === t.length)t[i] = 3;
    return t;
  }
  function check(t,n){
    if(+[...t].reverse().join("") > n)return -1;
    var a = 0;
    for(var i = 0; i < t.length; i++){
      if(t[i] === 3)a |= 4;
      else if(t[i] === 5)a |= 2;
      else if(t[i] === 7)a |= 1;
    }
    if(a === 7)return 1;
    return 0;
  }
}