#include <bits/stdc++.h>
using namespace std;
const long long inf = 2000000100;
char ch[17] = {'0', '0', '1', '2', '3', '4', '5', '6', '7',
               '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
long long f[20][20], c[100][30];
int n, num[20];
void ycl() {
  int i, j;
  for (i = 0; i <= 60; i++) c[i][0] = 1;
  for (i = 1; i <= 60; i++)
    for (j = 1; j <= min(i, 15); j++)
      c[i][j] = min(inf, c[i - 1][j - 1] + c[i - 1][j]);
}
void dp(int n) {
  int i, j, k;
  memset(f, 0, sizeof(f));
  f[0][0] = 1;
  for (i = 1; i <= 16; i++)
    for (j = 0; j <= n; j++)
      if (f[i - 1][j])
        for (k = 0; ((k <= num[i]) && (j + k <= n)); k++) {
          f[i][j + k] += f[i - 1][j] * c[j + k][k];
          if (f[i][j + k] > inf) f[i][j + k] = inf;
        }
}
int main() {
  int i, j, k, m;
  bool fl = 0;
  ycl();
  scanf("%d%d", &n, &m);
  for (i = 1; i <= 16; i++) num[i] = m;
  for (i = 1;; i++) {
    m = n;
    for (j = 2; j <= 16; j++) {
      num[j]--;
      dp(i - 1);
      num[j]++;
      if (f[16][i - 1] >= n) {
        fl = 1;
        break;
      } else
        n -= f[16][i - 1];
    }
    if (fl) {
      n = m;
      break;
    }
  }
  fl = 0;
  for (; i; i--) {
    for (j = 1; j <= 16; j++)
      if ((num[j]) && ((fl) || (j != 1))) {
        num[j]--;
        dp(i - 1);
        if (f[16][i - 1] >= n) {
          printf("%c", ch[j]);
          break;
        }
        n -= f[16][i - 1];
        num[j]++;
      }
    fl = 1;
  }
  printf("\n");
  return 0;
}
