#include <bits/stdc++.h>
using namespace std;
int n, t;
const int MAXN = 210;
int tp = 0, st[MAXN];
void trans(long long x) {
  tp = 0;
  while (x) st[++tp] = x % 16, x /= 16;
}
int ret[MAXN];
int C[MAXN][MAXN];
void Init() {
  int N = 200;
  C[0][0] = 1;
  for (int i = 1; i <= N; i++) {
    C[i][0] = 1;
    for (int j = 1; j <= i; j++) {
      C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
    }
  }
}
long long dp[17][17];
void Dodp() {
  memset(dp, 0, sizeof dp);
  dp[0][0] = 1;
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 17; j++) {
      if (dp[i][j]) {
        for (int nxt = 0; nxt + j < 17 && nxt <= ret[i]; nxt++) {
          dp[i + 1][j + nxt] += dp[i][j] * C[j + nxt][j];
        }
      }
    }
  }
}
long long Count(int len) {
  for (int i = 0; i < 16; i++)
    if (ret[i] < 0) return 0;
  Dodp();
  return dp[16][len];
}
long long Calc(long long x) {
  trans(x);
  for (int i = 0; i < 16; i++) ret[i] = t;
  long long ans = 0;
  for (int i = tp; i; i--) {
    for (int j = (i == tp); j < st[i]; j++) {
      ret[j]--;
      if (ret[j] >= 0) {
        ans += Count(i - 1);
      }
      ret[j]++;
    }
    ret[st[i]]--;
    if (ret[st[i]] < 0) break;
  }
  ans += Count(0);
  for (int i = 0; i < 16; i++) ret[i] = t;
  ret[1]--;
  Dodp();
  ret[1]++;
  for (int b = 1; b < tp; b++) {
    ans += dp[16][b - 1] * 15;
  }
  return ans;
}
int main() {
  scanf("%d%d", &n, &t);
  Init();
  long long l = 1, r = (1LL << 60);
  while (l < r) {
    long long mid = (l + r) >> 1;
    if (Calc(mid) < n)
      l = mid + 1;
    else
      r = mid;
  }
  trans(l);
  for (int i = tp; i; i--) {
    if (st[i] < 10)
      printf("%d", st[i]);
    else
      putchar('a' + st[i] - 10);
  }
  putchar(10);
}
