#include <bits/stdc++.h>
using namespace std;
const int64_t INF = 1e18;
void lim_add(int64_t& a, int64_t b) { a = min(a + b, INF); }
void lim_mul(int64_t& a, int64_t b) {
  if (a == 0 || b == 0) {
    a = 0;
  } else if (a > INF / b) {
    a = INF;
  } else {
    a = a * b;
  }
}
int main() {
  int i, j, k;
  int64_t N, K, M;
  cin >> N >> K >> M;
  string fib[13];
  fib[0] = "0";
  fib[1] = "1";
  for (i = 2; i <= 12; i++) fib[i] = fib[i - 2] + fib[i - 1];
  if (N <= 11) {
    string s = fib[N];
    vector<string> ss;
    for (i = 1; i <= s.size(); i++) ss.push_back(s.substr(s.size() - i, i));
    sort(ss.begin(), ss.end());
    cout << ss[K - 1].substr(0, M) << endl;
    return 0;
  }
  int64_t num1[201], num2[201];
  num1[0] = num1[1] = num2[0] = num2[1] = 1;
  for (i = 2; i <= 200; i++) {
    num1[i] = num1[i - 1];
    lim_add(num1[i], num1[i - 2]);
    num2[i] = num2[i - 1];
    lim_add(num2[i], num2[i - 2]);
    if (i % 2 == 0) lim_add(num2[i], 1);
  }
  map<string, int64_t> mp;
  string A = fib[11], B = fib[12];
  string AB = A + B, BAB = B + A + B, BB = B + B;
  for (i = 1; i < 200; i++) {
    lim_add(mp[B.substr(B.size() - i, i)], 1);
  }
  for (i = 0; i + 200 <= B.size(); i++) {
    lim_add(mp[B.substr(i, 200)], num1[N - 12]);
  }
  if (N >= 13) {
    for (i = 0; i < A.size(); i++) {
      lim_add(mp[AB.substr(i, 200)], num1[N - 13]);
    }
  }
  if (N >= 14) {
    for (i = B.size() - 199; i < B.size(); i++) {
      lim_add(mp[BAB.substr(i, 200)], num2[N - 14]);
    }
  }
  if (N >= 15) {
    for (i = B.size() - 199; i < B.size(); i++) {
      lim_add(mp[BB.substr(i, 200)], num2[N - 15]);
    }
  }
  int64_t sum = 0;
  for (auto p : mp) {
    sum += p.second;
    if (sum >= K) {
      cout << p.first.substr(0, M) << endl;
      return 0;
    }
  }
}
