#include <bits/stdc++.h>
using namespace std;
template <typename A, typename B>
inline void chmin(A &a, B b) {
  if (a > b) a = b;
}
template <typename A, typename B>
inline void chmax(A &a, B b) {
  if (a < b) a = b;
}
template <class A, class B>
ostream &operator<<(ostream &ost, const pair<A, B> &p) {
  ost << "{" << p.first << "," << p.second << "}";
  return ost;
}
template <class T>
ostream &operator<<(ostream &ost, const vector<T> &v) {
  ost << "{";
  for (long long i = 0; i < v.size(); i++) {
    if (i) ost << ",";
    ost << v[i];
  }
  ost << "}";
  return ost;
}
template <class T>
vector<long long> zalgorithm(T s) {
  vector<long long> a(s.size());
  a[0] = s.size();
  long long i = 1, j = 0;
  while (i < s.size()) {
    while (i + j < s.size() && s[j] == s[i + j]) j++;
    a[i] = j;
    if (j == 0) {
      i++;
      continue;
    }
    long long k = 1;
    while (i + k < s.size() && k + a[k] < j) a[i + k] = a[k], k++;
    i += k;
    j -= k;
  }
  return a;
}
long long N, K, M;
vector<long long> calcPre(const string &s, const string &p) {
  string X = s + p;
  vector<long long> z = zalgorithm(X);
  vector<long long> a(p.size() + 1);
  for (long long i = 1; i <= p.size(); i++) {
    if (z[X.size() - i] == i) a[i] = 1;
  }
  return a;
}
vector<long long> calcSuf(const string &s, const string &p) {
  string X = p + s;
  vector<long long> z = zalgorithm(X);
  vector<long long> a(p.size() + 1);
  for (long long i = 1; i <= p.size(); i++) {
    if (z[X.size() - i] == i) a[i] = 1;
  }
  return a;
}
long long calcOcc(const string &s, const string &p) {
  string X = p + s;
  vector<long long> z = zalgorithm(X);
  long long ret = 0;
  for (long long i = 0; i < s.size(); i++)
    if (z[p.size() + i] >= p.size()) ret++;
  return ret;
}
long long mrg(const vector<long long> &a, const vector<long long> &b) {
  long long cnt = 0;
  for (long long i = 0; i < a.size(); i++)
    if (a[i] && b[b.size() - 1 - i]) cnt++;
  return cnt;
}
vector<long long> pre[222], suf[222];
long long occ[222];
vector<string> first;
void calc(string s) {
  long long t;
  if (N <= 1) {
    t = 0;
  } else {
    t = 2;
    while (first[t].size() < s.size()) t++;
  }
  for (long long k = 0; k < (2); k++) {
    pre[t + k] = calcPre(first[t + k], s);
    suf[t + k] = calcSuf(first[t + k], s);
    occ[t + k] = calcOcc(first[t + k], s);
    chmin(occ[t + k], K + 1);
  }
  long long BC = mrg(suf[t], pre[t + 1]);
  long long BA = mrg(suf[t], pre[t]);
  for (long long i = t + 2; i <= N; i++) {
    occ[i] = occ[i - 1] + occ[i - 2] + BC;
    chmin(occ[i], K + 1);
    swap(pre[i], pre[i - 2]);
    swap(suf[i], suf[i - 2]);
    swap(BC, BA);
  }
}
signed main() {
  first.push_back("0");
  first.push_back("1");
  while (first.back().size() < 10000) {
    first.push_back(first[first.size() - 2] + first[first.size() - 1]);
  }
  cin >> N >> K >> M;
  K--;
  string ans;
  for (long long i = 0; i < M; i++) {
    if (i) {
      if (suf[N][ans.size()]) {
        if (K == 0) break;
        K--;
      }
    }
    calc(ans + "0");
    long long tmp = occ[N];
    if (tmp <= K) {
      K -= tmp;
      ans += "1";
      calc(ans);
    } else {
      ans += "0";
    }
  }
  cout << ans << endl;
  return 0;
}
