#include <bits/stdc++.h>
using namespace std;
bool check(int n, int pos) { return (n & (1 << pos)) >> pos; }
const int M = 100010;
vector<int> lucky;
map<int, int> islucky;
long long f[M];
int solve(int actualpos, long long k, vector<int> numbers) {
  if (numbers.size() == 1)
    return (islucky[numbers[0]] && islucky[actualpos]);
  else {
    int i;
    for (i = 0; i < numbers.size(); i++) {
      if (k - f[numbers.size() - 1] <= 0) break;
      k -= f[numbers.size() - 1];
    }
    int rdx = (islucky[numbers[i]] && islucky[actualpos]);
    numbers.erase(numbers.begin() + i);
    return rdx + solve(actualpos + 1, k, numbers);
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  int i, j, k, n;
  for (i = 1; i <= 9; i++) {
    for (j = 0; j < (1 << i); j++) {
      char a[15];
      for (k = 0; k < i; k++) a[k] = check(j, k) ? '4' : '7';
      a[i] = '\0';
      lucky.push_back(atoi(a));
    }
  }
  sort((lucky).begin(), (lucky).end());
  for (int a : lucky) islucky[a] = 1;
  scanf("%d%d", &n, &k);
  vector<int> imp;
  for (i = n; i > 0 && imp.size() < 14; i--) imp.push_back(i);
  sort((imp).begin(), (imp).end());
  f[0] = 1;
  for (i = 1; i < 17; i++) f[i] = i * f[i - 1];
  if (n < 15 && k > f[n]) {
    printf("%s\n", "-1");
    return 0;
  };
  int ls = lower_bound((lucky).begin(), (lucky).end(), imp[0]) - lucky.begin();
  int gr = solve(imp[0], k, imp);
  printf("%d\n", ls + gr);
  return 0;
}
