func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long INF = (1ll << 60);   const int N = 205;   int n, m, _len;   int nxt[N];   long long k;   long long ADD(long long x, long long y) { return min(INF, x + y); }   struct node {     char pref[N];     char suff[N];     long long len;     long long sum;   } t[N * 4], eddd;   char s[N * 4];   char ans[N];   node operator+(node a, node b) {     node ans;     ans.len = ADD(a.len, b.len);     ans.sum = ADD(a.sum, b.sum);     int l1 = min(a.len, 2ll * _len);     int l2 = min(b.len, 2ll * _len);     for (int i = (int)(1); i <= (int)(min(l1, _len)); i++) s[i] = a.pref[i];     for (int i = (int)(1); i <= (int)(min(l1, _len)); i++)       s[l1 - i + 1] = a.suff[i];     for (int i = (int)(1); i <= (int)(min(l2, _len)); i++) s[l1 + i] = b.pref[i];     for (int i = (int)(1); i <= (int)(min(l2, _len)); i++)       s[l1 + l2 - i + 1] = b.suff[i];     int p = 0;     s[l1 + l2 + 1] = 0;     for (int i = (int)(l1 - min(l1, _len - 1) + 1);          i <= (int)(l1 + 1 + min(l2, _len - 1) - 1); i++) {       for (; p && s[i] != ::ans[p + 1]; p = nxt[p])         ;       if (s[i] == ::ans[p + 1]) ++p;       if (p == _len) ++ans.sum, p = nxt[p];     }     for (int i = (int)(1); i <= (int)(min(_len, l1 + l2)); i++)       ans.pref[i] = s[i];     for (int i = (int)(1); i <= (int)(min(_len, l1 + l2)); i++)       ans.suff[i] = s[l1 + l2 - i + 1];     return ans;   }   long long count(int l) {     _len = l;     nxt[1] = 0;     for (int i = (int)(2); i <= (int)(l); i++) {       int j = nxt[i - 1];       for (; j && ans[j + 1] != ans[i]; j = nxt[j])         ;       nxt[i] = j + (ans[j + 1] == ans[i]);     }     t[0].pref[1] = t[0].suff[1] =  0 ;     t[1].pref[1] = t[1].suff[1] =  1 ;     eddd.pref[1] = eddd.suff[1] =  2 ;     t[0].len = t[1].len = eddd.len = 1;     t[0].sum = (l == 1 && ans[1] ==  0 );     t[1].sum = (l == 1 && ans[1] ==  1 );     eddd.sum = (l == 1 && ans[1] ==  2 );     for (int i = (int)(2); i <= (int)(n); i++) {       t[i] = t[i - 2] + t[i - 1];     }     return (t[n] + eddd).sum;   }   int main() {     scanf( %d%lld%d , &n, &k, &m);     k++;     for (int i = (int)(1); i <= (int)(m); i++) {       ans[i] =  2 ;       long long val = count(i);       if (val >= k) break;       k -= val;       ans[i] =  0 ;       val = count(i);       if (val >= k) {         putchar( 0 );         continue;       }       k -= val;       ans[i] =  1 ;       val = count(i);       if (val >= k) {         putchar( 1 );         continue;       }       assert(0);     }   }   