#include<stdio.h>
#define NMAX 501//161
struct p2{unsigned l,a;};
unsigned min/*a,[NMAX*NMAX/2]*/;
p2 v[20];
unsigned b[NMAX][NMAX];
unsigned cauta(unsigned x){
unsigned i=0,px=x*x;
while(px>=v[i].a) ++i;
return i-1;
}
unsigned minim(unsigned a,unsigned b){
return a<=b?a:b;
}
unsigned maxim(unsigned a,unsigned b){
return a>=b?a:b;
}
void umple(unsigned l,unsigned c,unsigned dim){
unsigned i,j;
for(i=l;i<=l+dim;++i)
for(j=c;j<=c+dim;++j)
b[i][j]=min;
}
void f(unsigned ll,unsigned cc,unsigned l,unsigned c){
unsigned d1,d2,d4,i,dim;
d1=minim(ll,cc);
i=cauta(d1);
d2=ll-v[i].l;
//d3=maxim(ll,cc);
d4=cc-v[i].l;
min++;//a[min]=v[i].a;
dim=v[i].l;
umple(l,c,dim);
if(d2+d4){
if(d2) f(d2,v[i].l,l+dim,c);
if(d4) f(v[i].l,d4,l,c+dim);
if(d2&&d4) f(d2,d4,l+dim,c+dim);
}
}
int main(){
freopen("piese.in","r",stdin);
freopen("piese.out","w",stdout);
unsigned m,n;
scanf("%u%u",&m,&n);
unsigned i,j;
v[0].l=1;
v[0].a=1;
for(i=1;i<20;++i){
v[i].l=2*v[i-1].l;
v[i].a=v[i].l*v[i].l;
}
f(m,n,0,0);
printf("%u\n",min);
//for(i=1;i<=min;++i) printf("%u ",a[i]);
//printf("\n");
for(i=0;i<m;++i){
for(j=0;j<n;++j) printf("%u ",b[i][j]);
printf("\n");
}
return 0;
}