#include <bits/stdc++.h>
using namespace std;
int n, k;
int n1;
vector<long long> v;
int c[20];
int a[20];
bool viz[20];
int f[20];
inline void get(int i) {
  int cif = 0;
  long long zece = 1;
  long long r = 0;
  for (zece = 1; i > 0; i >>= 1, zece *= 10LL) {
    ++cif;
    if ((i & 1) != 0)
      r += 7LL * zece;
    else
      r += 4LL * zece;
  }
  if (r != 0LL) v.push_back(r);
  for (++cif; cif < 11; ++cif, zece *= 10LL) {
    r += 4LL * zece;
    v.push_back(r);
  }
}
void back(int k1) {
  if (k1 == n1 + 1) return;
  for (int i = 1; i <= n1; ++i) {
    if (viz[i]) continue;
    if (k > f[n1 - k1])
      k -= f[n1 - k1];
    else {
      viz[i] = true;
      a[k1] = i;
      back(k1 + 1);
      return;
    }
  }
  printf("-1\n");
  exit(0);
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 0; i < 1024; ++i) {
    get(i);
  }
  sort(v.begin(), v.end());
  int start = max(1, n - 12);
  f[0] = f[1] = 1;
  for (int i = 2; i < 13; ++i) f[i] = f[i - 1] * i;
  n1 = n - start + 1;
  back(1);
  int rez = 0;
  long long start1 = (long long)start;
  for (size_t i = 0, lim = v.size(); i < lim && v[i] < start1; ++i) {
    ++rez;
  }
  int x = start;
  for (int i = 1; i <= n1; ++i, ++x) {
    c[i] = x;
  }
  for (int i = 1; i <= n1; ++i) {
    if (find(v.begin(), v.end(), (long long)(i - 1) + start1) != v.end() &&
        find(v.begin(), v.end(), (long long)c[a[i]]) != v.end())
      ++rez;
  }
  printf("%d\n", rez);
  return 0;
}
