Let's denote (yet again) the sequence of Fibonacci strings:

F(0) =  0, F(1) =  1, F(i) = F(i - 2) + F(i - 1), where the plus sign denotes the concatenation of two strings.

Let's denote the lexicographically sorted sequence of suffixes of string F(i) as A(F(i)). For example, F(4) is 01101, and A(F(4)) is the following sequence: 01, 01101, 1, 101, 1101. Elements in this sequence are numbered from 1.

Your task is to print m first characters of k-th element of A(F(n)). If there are less than m characters in this suffix, then output the whole suffix.

Input

The only line of the input contains three numbers n, k and m (1 ≤ n, m ≤ 200, 1 ≤ k ≤ 10^{18}) denoting the index of the Fibonacci string you have to consider, the index of the element of A(F(n)) and the number of characters you have to output, respectively.

It is guaranteed that k does not exceed the length of F(n).

Output

Output m first characters of k-th element of A(F(n)), or the whole element if its length is less than m.

Examples

Input

4 5 3


Output

110


Input

4 3 3


Output

1
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma comment(linker, "/STACK:2000000")
using namespace std;
template <int D, typename T>
struct Vec : public vector<Vec<D - 1, T>> {
  static_assert(D >= 1, "Vector dimension must be greater than zero!");
  template <typename... Args>
  Vec(int n = 0, Args... args)
      : vector<Vec<D - 1, T>>(n, Vec<D - 1, T>(args...)) {}
};
template <typename T>
struct Vec<1, T> : public vector<T> {
  Vec(int n = 0, T val = T()) : vector<T>(n, val) {}
};
using ll = long long;
using db = long double;
using ii = pair<int, int>;
const int N = 2e6 + 5, LG = 19, MOD = 998244353;
const int SQ = 320;
const long double EPS = 1e-7;
string prefix[205];
string suffix[205];
void init() {
  prefix[0] = suffix[0] = "0";
  prefix[1] = suffix[1] = "1";
  for (int i = 2; i <= 200; i++) {
    prefix[i] = prefix[i - 2] + prefix[i - 1];
    if (prefix[i].size() > 200) prefix[i].resize(200);
    suffix[i] = suffix[i - 2] + suffix[i - 1];
    if (suffix[i].size() > 200)
      suffix[i] = suffix[i].substr(suffix[i].size() - 200);
  }
}
int n, m;
ll k;
vector<int> FAIL(string pat) {
  int m = pat.size();
  vector<int> first(m + 1);
  int i = 0, j = -1;
  first[0] = -1;
  while (i < m) {
    while (j >= 0 && pat[i] != pat[j]) j = first[j];
    i++, j++;
    first[i] = j;
  }
  return first;
}
vector<int> first;
int KMP_Search(string txt, string pat) {
  int i = 0, j = 0;
  int n = txt.size(), m = pat.size();
  int ret = 0;
  while (i < n) {
    while (j >= 0 && txt[i] != pat[j]) j = first[j];
    i++, j++;
    if (j == m) j = first[j], ret++;
  }
  return ret;
}
ll ans[N];
int get(int n, string pat) {
  string lft = suffix[n - 2];
  if (lft.size() > pat.size() - 1)
    lft = lft.substr(lft.size() - (pat.size() - 1));
  string rt = prefix[n - 1];
  if (rt.size() > pat.size() - 1) rt.resize(pat.size() - 1);
  return KMP_Search(lft + rt, pat);
}
ll calc(int n, string pattern) {
  if (pattern.empty()) {
    ans[0] = ans[1] = 1;
    for (int i = 2; i <= n; i++) {
      ans[i] = ans[i - 1] + ans[i - 2];
      ans[i] = min(ans[i], 1000000000ll * 1000000000ll + 1);
    }
    return ans[n];
  }
  first = FAIL(pattern);
  ans[0] = pattern == "0";
  ans[1] = pattern == "1";
  for (int i = 2; i <= n; i++) {
    ans[i] = ans[i - 1] + ans[i - 2] + get(i, pattern);
    ans[i] = min(ans[i], 1000000000ll * 1000000000ll + 1);
  }
  return ans[n];
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  init();
  cin >> n >> k >> m;
  string cur = "";
  for (int i = 0; i < m; i++) {
    ll v = calc(n, cur);
    ll v0 = calc(n, cur + "0");
    ll v1 = calc(n, cur + "1");
    if (v == v0 + v1 + 1) {
      if (k == 1) break;
      k--;
    }
    if (v0 < k) {
      k -= v0;
      cur += "1";
    } else
      cur += "0";
  }
  cout << cur << endl;
  return 0;
}
