#include <stdio.h>
#include <stdlib.h>
#define prec 6
#define hite 16
typedef unsigned short uc;
typedef struct{unsigned int a[prec];} b;
void addTo(b* x, b* y) {int j = prec, c=0; while(j--) {
  int q = x->a[j] + y->a[j] + c;
  if(q>=(1<<28)) {x->a[j] = q - (1<<28); c = 1;}
  else {x->a[j] = q; c = 0;}}
  if(c) {printf("Overflow\n"); exit(3);}}
int div10(b* x){int c = 0, j; for(j=0; j<prec; ++j){
  unsigned int n = (c<<28) + x->a[j]; x->a[j] = n/10; c =  n%10;}
  return c;}
void pr(b x){char d[51]; int j = 51; while(j--) d[j] = div10(&x) + '0';
  for(j=0; j<51; ++j) putchar(d[j]);}

int main(){
// -1 0 1 2 3 4  5  6  7  8  9  10  11  12  13  14   15   16
//  1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
uc pats[2584];
b b0, b1;
{int j=prec; while(j--) b0.a[j] = b1.a[j] = 0; b1.a[prec-1]=1;} 
{int j = 65536, x = 0; while (j--) if(!(j & (j<<1))) pats[x++] = j;
  if (x != 2584) {printf("zilch %d\n", x); exit (3);}}
 {b old[2584], new[2584]; int hight=hite-1;
 {int j=2584; while(j--) old[j] = b1;}
 while (hight--)
 {int k = 2584; {int n = 2584; while(n--) new[n] = b0;}
   while(k--) {int n = 2584; while(n--) if(!(pats[n] & pats[k])) 
   addTo(new+n, old+k);}
   {int n = 2584; while(n--) old[n] = new[n];}}
  {int j=2584; while(j--) {pr(old[j]); printf(" %04X\n", pats[j]);}}
{int j=2584; b s = b0; while(j--) addTo(&s, old+j);
  pr(s); printf(" %d by 16 patterns All together\n", hite);}
}
return 0;}