#include <bits/stdc++.h>
using namespace std;
const int N = 222;
const int MOD = 1e9 + 9;
const int X = 209384720;
const long long int INF = 2e18;
long long int n, k, m, pot[N];
int nshort;
vector<long long int> h[N];
string f[N];
bool pref[N][N], suf[N][N];
long long int cnt[N];
long long int get_hash(const vector<long long int> &h, int l, int r) {
  long long int ans = h[r] - h[l] * pot[r - l] % MOD;
  return ans < 0 ? ans + MOD : ans;
}
void process(const string &s) {
  vector<long long int> hs(1, 0);
  for (char c : s) {
    hs.push_back((hs.back() * X + c) % MOD);
  }
  for (int i = 0; i <= n; i++) {
    if (i < nshort) {
      for (int l = 0; l <= min(((int)(s).size()), ((int)(f[i]).size())); l++) {
        pref[i][l] = get_hash(h[i], 0, l) ==
                     get_hash(hs, ((int)(s).size()) - l, ((int)(s).size()));
        suf[i][l] = get_hash(h[i], ((int)(f[i]).size()) - l,
                             ((int)(f[i]).size())) == get_hash(hs, 0, l);
      }
      cnt[i] = 0;
      for (int j = 0; j + ((int)(s).size()) <= ((int)(f[i]).size()); j++)
        cnt[i] += get_hash(h[i], j, j + ((int)(s).size())) ==
                  get_hash(hs, 0, ((int)(s).size()));
    } else {
      for (int l = 0; l < (int)(((int)(s).size()) + 1); l++) {
        pref[i][l] = pref[i - 2][l];
        suf[i][l] = suf[i - 2][l];
      }
      cnt[i] = min(INF, cnt[i - 1] + cnt[i - 2]);
      for (int l = 1; l < ((int)(s).size()); l++) {
        cnt[i] += suf[i - 2][l] && pref[i - 1][((int)(s).size()) - l];
      }
      cnt[i] = min(cnt[i], INF);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  pot[0] = 1;
  for (int n = (int)(1); n < ((int)N); n++) pot[n] = pot[n - 1] * X % MOD;
  f[0] = "0";
  f[1] = "1";
  for (int n = 2; n < N; n++) {
    f[n] = f[n - 2] + f[n - 1];
    if (((int)(f[n]).size()) >= N && ((int)(f[n - 1]).size()) >= N) {
      nshort = n + 1;
      break;
    }
  }
  if (false) {
    for (int i = nshort; i < 30; i++) f[i] = f[i - 2] + f[i - 1];
    vector<string> ss;
    for (int i = 0; i < (int)(((int)(f[20]).size()) + 1); i++)
      ss.push_back(f[20].substr(i));
    sort((ss).begin(), (ss).end());
    cerr << ss[10000] << endl;
  }
  for (int i = 0; i < (int)(nshort); i++) {
    h[i].push_back(0);
    for (char c : f[i]) h[i].push_back((h[i].back() * X + c) % MOD);
  }
  cin >> n >> k >> m;
  string ans = "";
  for (int _ = 0; _ < (int)(m); _++) {
    process(ans);
    if (suf[n][((int)(ans).size())]) {
      if (k == 0) break;
      --k;
    }
    ans += '0';
    process(ans);
    if (cnt[n] <= k) {
      k -= cnt[n];
      ans.back() = '1';
    }
  }
  cout << ans << endl;
  return 0;
}
