#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e5 + 5;
const long long maxm = 1e3 + 5;
const long long inf = 1e18;
namespace IO {
const int SIZE = (1 << 20) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = obuf + SIZE - 1;
char _st[55];
int _qr = 0;
inline char gc() {
  return (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
          (iS == iT ? EOF : *iS++) : *iS++);
}
inline void qread() {}
template <class T1, class... T2>
inline void qread(T1 &IEE, T2 &...ls) {
  register T1 __ = 0, ___ = 1;
  register char ch;
  while (!isdigit(ch = gc())) ___ = (ch == '-') ? -___ : ___;
  do {
    __ = (__ << 1) + (__ << 3) + (ch ^ 48);
  } while (isdigit(ch = gc()));
  __ *= ___;
  IEE = __;
  qread(ls...);
  return;
}
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
  return;
}
inline void putc_(char _x) {
  *oS++ = _x;
  if (oS == oT) flush();
}
inline void qwrite() {}
template <class T1, class... T2>
inline void qwrite(T1 IEE, T2... ls) {
  if (!IEE) putc_('0');
  if (IEE < 0) putc_('-'), IEE = -IEE;
  while (IEE) _st[++_qr] = IEE % 10 + '0', IEE /= 10;
  while (_qr) putc_(_st[_qr--]);
  qwrite(ls...);
  return;
}
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher;
}  // namespace IO
using namespace IO;
long long n, m, k;
long long cnt[305];
bool f[305][305];
bool g[305][305];
char ans[maxn], ansf[maxn];
long long fib[305];
char b[15][305];
void init() {
  fib[0] = fib[1] = 1;
  for (int i = 2; i <= n; i++) {
    fib[i] = min(inf, fib[i - 1] + fib[i - 2]);
  }
  b[0][1] = '0';
  b[1][1] = '1';
  for (int i = 2; i <= 11; i++) {
    for (int j = 1; j <= fib[i - 2]; j++) {
      b[i][j] = b[i - 2][j];
    }
    for (int j = 1; j <= fib[i - 1]; j++) {
      b[i][j + fib[i - 2]] = b[i - 1][j];
    }
  }
  return;
}
void getcnt() {
  long long len = strlen(ans + 1);
  memset(f, 0, sizeof(f));
  memset(g, 0, sizeof(g));
  f[0][1] = ans[1] == '0';
  g[0][1] = ans[len] == '0';
  f[1][1] = ans[1] == '1';
  g[1][1] = ans[len] == '1';
  cnt[0] = len == 1 && f[0][1];
  cnt[1] = len == 1 && f[1][1];
  for (int i = 2; i <= n; i++) {
    cnt[i] = min(inf, cnt[i - 1] + cnt[i - 2]);
    for (int j = 1; j < len; j++) {
      cnt[i] += f[i - 2][j] && g[i - 1][len - j];
    }
    for (int j = 1; j <= len; j++) {
      f[i][j] = f[i - 1][j];
      g[i][j] = g[i - 2][j];
    }
    for (long long j = fib[i - 1] + 1; j <= len; j++) {
      bool flag = 1;
      for (int k = j - fib[i - 1] + 1; k <= j; k++) {
        flag &= b[i - 1][k - j + fib[i - 1]] == ans[k];
      }
      f[i][j] = f[i - 2][j - fib[i - 1]] && flag;
    }
    for (long long j = fib[i - 2]; j <= len - 1; j++) {
      bool flag = 1;
      for (int k = j - fib[i - 2] + 1; k <= j; k++) {
        flag &= b[i - 2][k - j + fib[i - 2]] == ans[k];
      }
      g[i][len - j + fib[i - 2]] = g[i - 1][len - j] && flag;
    }
  }
  return;
}
int main() {
  cin >> n >> k >> m;
  init();
  for (int i = 1; i <= m; i++) {
    ans[i] = '0';
    for (int j = 1; j <= i; j++) ansf[j] = ans[j];
    reverse(ansf + 1, ansf + i + 1);
    getcnt();
    long long cnt0 = cnt[n];
    if (i > 1 && f[n][i - 1]) {
      if (k == 1) {
        for (int j = 1; j < i; j++) {
          cout << ans[j];
        }
        puts("");
        return 0;
      }
      k--;
    }
    if (cnt0 >= k) continue;
    k -= cnt0;
    ans[i] = '1';
  }
  for (int i = 1; i <= m; i++) {
    cout << ans[i];
  }
  puts("");
  return 0;
}
