#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;}