#include <bits/stdc++.h>
#define INT long long int
using namespace std;
char infile[100], outfile[100];

long long int a[17][17];
long long int c[17][17];
long long int b[17][17][1<<18];
long long int t=1, k=1, n, m;
long long int f(long int x, long long int y, long long int s){
    long long int sum=0, ss;
    if(x==n) return 1;
    if(y==m){
        return f(x+1,0,s);
    }
    if(b[x][y][s]) return b[x][y][s];
    ss = s/t;
    sum = (sum + f(x,y+1,(s%t)*2+c[x+1][y]))%100000007;
    if(ss==1){
       if(t>1 and (s%t)/(t/2)==1 and  y+1<m){
           sum = (sum + f(x,y+2,(s%(t/2))*4+c[x+1][y]*2+c[x+1][y+1]))%100000007;;
       }
       if(c[x+1][y]==1 and x+1<n){
           sum = (sum + f(x,y+1,(s%t)*2))%100000007;;
       }
    }
    b[x][y][s]=sum;
    return sum;
}
int main(){
    long long int i, j, s, kk = 1, l, r,I;
    //scanf("%lld %lld", &n, &m);
    
    for(I=1;I<=15; I++){
	    sprintf(infile, ".%d.in", I);
		freopen(infile, "w", stdout);
		//
		n = 1;
		m = 10;
		kk=1;
		//
		t=1<<(m-1);
    	k=t/2;
    	printf("%d %d\n",n, m);
	    for(i=0;i<n;i++){
	    	for(j=0;j<m;j++){
	        	//scanf("%lld",&a[i][j]);
	        	//
	        	r = rand()%2;
	        	//
				printf("%d ", r);
	        	a[i][j] = r;
			}
			printf("\n");
		}
	    for(i=0;i<3;i++){
	        memset(b,0,sizeof(b));
	        memset(c,0,sizeof(c));
	        s = 0;
	        for(j=0;j<m;j++){
	            s=s*2+(a[0][j]>i ? 1 : 0);
	        }
	        for(k=0;k<n;k++){
	            for(j=0;j<m;j++){
	                c[k][j] = (a[k][j]>i ? 1 : 0);
	            }
	        }
	        l = f(0,0,s);
	        kk = (kk * l)%100000007;;
	        //printf("%d ",s);
	        //printf("%d\n", l);
	   	}
	   	sprintf(infile, ".%d.out", I);
	    freopen(infile, "w", stdout);
	   	printf("%lld",kk);
	}
    return 0;
}
