#include <bits/stdc++.h>   using namespace std;   const int N = 2e5 + 9;   vector<int> getBorder(const string str) {     int n = str.size();     vector<int> border(n, -1);     for (int i = 1, j = -1; i < n; i++) {       while (j >= 0 && str[i] != str[j + 1]) {         j = border[j];       }       if (str[i] == str[j + 1]) j++;       border[i] = j;     }     return border;   }   int matchPattern(string txt, string pat, const vector<int> border) {     int freq = 0;     for (int i = 0, j = -1; i < (int)txt.size(); i++) {       while (j >= 0 && txt[i] != pat[j + 1]) {         j = border[j];       }       if (txt[i] == pat[j + 1]) {         j++;       }       if (j + 1 == (int)pat.size()) {         freq++;         j = border[j];       }     }     return freq;   }   string cut(string s, int p, bool pref = true) {     if (!pref) {       reverse(s.begin(), s.end());     }     while ((int)s.size() >= p) s.pop_back();     if (!pref) {       reverse(s.begin(), s.end());     }     return s;   }   const int ms = 210;   string pref[ms], suf[ms];   long long trans[ms];   int bk = 14;   long long getFreq(int n, string pat, long long k) {     std::vector<long long> f(n + 1, 0);     if (pat ==  0 ) f[0]++;     if (pat ==  1 ) f[1]++;     auto border = getBorder(pat);     for (int i = 2; i <= n; i++) {       long long cur = trans[i - 2];       if (i < bk + 4) {         string curString = cut(suf[i - 2], (int)pat.size(), false) +                            cut(pref[i - 1], (int)pat.size());         cur = matchPattern(curString, pat, border);       }       f[i] = f[i - 1] + f[i - 2] + cur;       if (f[i] > k) return k + 1;       trans[i] = cur;     }     return min(f[n], k + 1);   }   int main() {     pref[0] = suf[0] =  0 ;     pref[1] = suf[1] =  1 ;     for (int i = 2; i < ms; i++) {       pref[i] = cut(pref[i - 2] + pref[i - 1], ms);       suf[i] = cut(suf[i - 2] + suf[i - 1], ms, false);     }     int n, m;     long long k;     cin >> n >> k >> m;     if (n == 0) {       cout <<  0 n ;       return 0;     }     if (n == 1) {       cout <<  1 n ;       return 0;     }     string ans;     k--;     while (k >= 0 && (int)ans.size() < m) {       if (ans.size() > 0 &&           suf[n].substr(suf[n].size() - ans.size(), ans.size()) == ans) {         k--;       }       if (k < 0) break;       ans +=  0 ;       long long got = getFreq(n, ans, k);       if (got <= k) {         ans.back() =  1 ;         k -= got;       }     }     cout << ans << endl;   }   