#include <bits/stdc++.h>   using namespace std;   const int MAX_N = 201;   inline void NEXT(const char *T, int *next, int t_len) {     next[0] = -1;     for (int i = 1; i < t_len; i++) {       int j = next[i - 1];       while (j >= 0 && T[i - 1] != T[j]) j = next[j];       if (j >= 0 && T[i - 1] == T[j])         next[i] = j + 1;       else         next[i] = 0;     }   }   int COUNT_KMP(const char *S, const char *T, int s_len, int t_len) {     int next[t_len];     NEXT(T, next, t_len);     int index, count = 0;     for (index = 0; index < s_len; ++index) {       int pos = 0;       int iter = index;       while (pos < t_len && iter < s_len) {         if (S[iter] == T[pos]) {           ++iter;           ++pos;         } else {           if (pos == 0)             ++iter;           else             pos = next[pos - 1] + 1;         }       }       if (pos == t_len && (iter - index) == t_len) ++count;     }     return count;   }   int my_substr(char *s, char *t, int pos, int len) {     int i;     for (i = 0; i < len; ++i) {       if (t[i + pos] ==   0 ) {         break;       }       s[i] = t[i + pos];     }     s[i] =   0 ;     return i;   }   int64_t cal(const char *s, int n, int64_t k) {     int64_t sum[MAX_N];     memset(sum, 0, sizeof(sum));     char f[MAX_N][MAX_N * 10 + 1];     int len[MAX_N];     memset(len, 0, sizeof(len));     int s_len = strlen(s);     sprintf(f[0],  0 );     sprintf(f[1],  1 );     len[0] = len[1] = 1;     if (s_len == 1) {       if (s[0] ==  0 ) {         sum[0]++;       } else if (s[0] ==  1 ) {         sum[1]++;       }     }     int max_len = s_len - 1;     char tmp_str[MAX_N * 10 + 1];     for (int i = 2; i <= n; ++i) {       len[i] = len[i - 2] + len[i - 1];       sprintf(f[i],  %s%s , f[i - 2], f[i - 1]);       int start = 0;       if (len[i - 2] > max_len) {         start = len[i - 2] - max_len;       }       int my_len = my_substr(tmp_str, f[i - 2], start, max_len);       my_len += my_substr(tmp_str + my_len, f[i - 1], 0, max_len);       int64_t result = COUNT_KMP(tmp_str, s, my_len, s_len);       sum[i] = sum[i - 2] + sum[i - 1] + result;       if (sum[i] > k) {         return sum[i];       }       if (len[i] > max_len * 2) {         int del_num = len[i] - (max_len * 2);         for (int pos = max_len + del_num; pos < len[i]; ++pos) {           f[i][pos - del_num] = f[i][pos];         }         len[i] = max_len * 2;         f[i][len[i]] =   0 ;       }     }     return sum[n];   }   int process() {     int n, m;     int64_t k;     char suffix[] =          110101101011011010110101101101011011010110101101101011011010110101101101           011010110110101101101011010110110101101011011010110110101101011011010110           11010110101101101011010110110101101101011010110110101101 ;     int suffix_len = strlen(suffix);     cin >> n >> k >> m;     char s[MAX_N];     memset(s,   0 , sizeof(s));     for (int i = 0; i < m; ++i) {       int pos = suffix_len - i;       int s_pos = 0;       while (pos < suffix_len) {         if (s[s_pos] != suffix[pos]) {           break;         }         s_pos++;         pos++;       }       if (pos == suffix_len && i > 0) {         if (k == 1) {           break;         }         k--;       }       if (i > 0 && s[i - 1] ==  0 ) {         s[i] =  1 ;         s[i + 1] =   0 ;         continue;       }       if (i > 1 && s[i - 1] ==  1  && s[i - 2] ==  1 ) {         s[i] =  0 ;         s[i + 1] =   0 ;         continue;       }       s[i] =  0 ;       s[i + 1] =   0 ;       int64_t count = cal(s, n, k);       if (count < k) {         k = k - count;         s[i] =  1 ;       }     }     printf( %s n , s);     return 0;   }   int main(int argc, char *argv[]) {     process();     return 0;   }