#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
struct node {
  string l, r;
  long long tot;
} f[205];
int n;
long long query(string s) {
  int l = s.size();
  if (l == 1) {
    if (s[0] == '0')
      f[0].tot = 1, f[1].tot = 0;
    else
      f[0].tot = 0, f[1].tot = 1;
  } else
    f[0].tot = f[1].tot = 0;
  for (int i = 2; i <= n; i++) {
    f[i].tot = f[i - 1].tot + f[i - 2].tot;
    string u = f[i - 2].r + f[i - 1].l;
    int sl = max(0, (int)f[i - 2].r.size() - l + 1);
    int k, sr = f[i - 2].r.size();
    for (int j = sl; j < sr; j++) {
      for (k = 0; k < l; k++) {
        if (j + k == u.size()) break;
        if (u[j + k] != s[k]) break;
      }
      f[i].tot += k == l;
    }
    if (f[i].tot > 1e18) return f[i].tot;
  }
  return f[n].tot;
}
int cqq(string s) {
  if (s.size() == 0) return 0;
  if (f[n].r.size() >= s.size()) {
    int i;
    for (i = 1; i <= s.size(); i++) {
      if (s[s.size() - i] != f[n].r[f[n].r.size() - i]) break;
    }
    return i > s.size();
  } else
    return 0;
}
int main() {
  int m, i, j;
  long long k;
  scanf("%d%lld%d", &n, &k, &m);
  f[0].l = f[0].r = "0";
  f[1].l = f[1].r = "1";
  for (i = 2; i <= n; i++) {
    if (f[i - 1].r.size() < m) {
      f[i].r = f[i - 2].r + f[i - 1].r;
      if (f[i].r.size() > m) f[i].r = f[i].r.substr(f[i].r.size() - m, m);
    } else
      f[i].r = f[i - 1].r;
    if (f[i - 2].l.size() < m) {
      f[i].l = f[i - 2].l + f[i - 1].l;
      if (f[i].l.size() > m) f[i].l = f[i].l.substr(0, m);
    } else
      f[i].l = f[i - 2].l;
  }
  string w = "";
  for (i = 0; i < m; i++) {
    int dd = cqq(w);
    if (dd == k) break;
    k -= dd;
    string s = w + "0";
    long long cc = query(s);
    if (cc == 0) {
      s = w + "1";
      if (query(s) == 0) break;
    }
    if (cc >= k)
      w += "0";
    else {
      k -= cc;
      w += "1";
    }
  }
  cout << w << endl;
  return 0;
}
