#include <bits/stdc++.h>
using namespace std;
int n, m;
long long K;
string fib[17], orzzyf[1005], ans;
long long f[205], match_len[2][2];
int part1[205], part2[205];
void work1() {
  for (register int i = 0; i < fib[n].length(); ++i)
    for (register int j = i; j < fib[n].length(); ++j)
      orzzyf[i + 1] += fib[n][j];
  sort(orzzyf + 1, orzzyf + 1 + fib[n].length());
  for (register int i = 0; i < m && i < orzzyf[K].length(); ++i)
    putchar(orzzyf[K][i]);
}
int count(string A) {
  int re = 0;
  for (register int i = 0; i <= A.length() - ans.length(); ++i) {
    int flag = 1;
    for (register int j = 0; j < ans.length(); ++j)
      if (ans[j] != A[i + j]) {
        flag = 0;
        break;
      }
    re += flag;
  }
  return re;
}
long long DP() {
  part1[14] = part2[14] = 0, part1[15] = part2[15] = 1;
  f[14] = count(fib[14]), f[15] = count(fib[15]);
  match_len[0][0] = count(fib[14] + fib[14]) - f[14] - f[14];
  match_len[0][1] = count(fib[14] + fib[15]) - f[14] - f[15];
  match_len[1][0] = count(fib[15] + fib[14]) - f[15] - f[14];
  match_len[1][1] = count(fib[15] + fib[15]) - f[15] - f[15];
  for (register int i = 16; i <= n; ++i) {
    part1[i] = part1[i - 2], part2[i] = part2[i - 1];
    f[i] = f[i - 1] + f[i - 2] + match_len[part2[i - 2]][part1[i - 1]];
    if (f[i] > 1e18) return f[i];
  }
  return f[n];
}
void work2() {
  for (register int i = 1; i <= m && K; ++i) {
    ans += '0';
    long long kl = DP();
    if (kl < K) K -= kl, ans[i - 1] = '1';
    int flag = 1;
    for (register int i = 0; i < ans.length(); ++i)
      if (ans[i] != fib[15][fib[15].length() - ans.length() + i]) {
        flag = 0;
        break;
      }
    K -= flag;
  }
  cout << ans;
}
int main() {
  scanf("%d%lld%d", &n, &K, &m);
  fib[0] = "0", fib[1] = "1";
  for (register int i = 2; i <= 15; ++i) fib[i] = fib[i - 2] + fib[i - 1];
  if (n <= 15)
    work1();
  else
    work2();
  return 0;
}
