#include <bits/stdc++.h>
using namespace std;
const int maxn = 210, P1 = 911382323, P2 = 972663749, mod = 1e9 + 9;
const long long inf = 2e18;
string suf[maxn], pre[maxn], ans;
vector<pair<int, int> > hs[maxn], hp[maxn], hans;
int pw1[maxn], pw2[maxn];
long long dp[maxn], k, pt;
int n, m;
pair<int, int> Hash(vector<pair<int, int> > &vec, int l, int r) {
  if (l == 0) return vec[r];
  int A = (1ll * vec[r].first - 1ll * vec[l - 1].first * pw1[r - l + 1]) % mod;
  int B =
      (1ll * vec[r].second - 1ll * vec[l - 1].second * pw2[r - l + 1]) % mod;
  if (A < 0) A += mod;
  if (B < 0) B += mod;
  return {A, B};
}
void Do(string &s, vector<pair<int, int> > &vec) {
  vec.clear();
  int A = 0, B = 0;
  for (int i = 0; i < int((s).size()); i++) {
    A = (1ll * A * P1 + s[i]) % mod;
    B = (1ll * B * P2 + s[i]) % mod;
    vec.push_back({A, B});
  }
}
long long check() {
  Do(ans, hans);
  memset(dp, 0, sizeof dp);
  if (ans == "0") dp[0] = 1;
  if (ans == "1") dp[1] = 1;
  for (int i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
    for (int j = 1; j < int((ans).size()); j++)
      dp[i] += (int((suf[i - 2]).size()) >= j &&
                Hash(hs[i - 2], int((suf[i - 2]).size()) - j,
                     int((suf[i - 2]).size()) - 1) == Hash(hans, 0, j - 1) &&
                int((pre[i - 1]).size()) >= (int((ans).size()) - j) &&
                Hash(hp[i - 1], 0, int((ans).size()) - j - 1) ==
                    Hash(hans, j, int((ans).size()) - 1));
    if (dp[i] >= inf) return inf;
  }
  return dp[n];
}
int main() {
  pw1[0] = pw2[0] = 1;
  for (int i = 1; i < maxn; i++) {
    pw1[i] = 1ll * pw1[i - 1] * P1 % mod;
    pw2[i] = 1ll * pw2[i - 1] * P2 % mod;
  }
  cin >> n >> k >> m;
  suf[0] = pre[0] = "0";
  suf[1] = pre[1] = "1";
  hs[0].push_back({int('0'), int('0')});
  hp[0].push_back({int('0'), int('0')});
  hs[1].push_back({int('1'), int('1')});
  hp[1].push_back({int('1'), int('1')});
  for (int i = 2; i <= n; i++) {
    if (m > int((suf[i - 1]).size()))
      suf[i] = suf[i - 2].substr(max(0, int((suf[i - 2]).size()) - m +
                                            int((suf[i - 1]).size()))) +
               suf[i - 1];
    else
      suf[i] = suf[i - 1];
    if (m > int((pre[i - 2]).size()))
      pre[i] =
          pre[i - 2] + pre[i - 1].substr(0, min(int((pre[i - 1]).size()),
                                                m - int((pre[i - 2]).size())));
    else
      pre[i] = pre[i - 2];
    Do(pre[i], hp[i]);
    Do(suf[i], hs[i]);
  }
  for (int i = 0; i < m; i++) {
    if (!ans.empty() &&
        (pt = pt + (int((suf[n]).size()) >= int((ans).size()) &&
                    suf[n].substr(int((suf[n]).size()) - int((ans).size())) ==
                        ans)) == k)
      break;
    ans += "0";
    long long num = check();
    if (pt + num < k) ans[int((ans).size()) - 1] = '1', pt += num;
  }
  cout << ans << endl;
  return 0;
}
