#include #include static const size_t MAXN = 1024; static const size_t MAX_NUM = 20000000; // This is enough to get one million of primes. char pr[MAX_NUM + 1]; int ans[MAXN][MAXN]; inline int next(int & prime) { ++ prime; while( !pr[prime] ) ++ prime; return prime; } int main() { int w, h; scanf( "%d %d", &w, &h ); int count = 0; memset(pr, 1, sizeof(pr)); for( int i = 2; i <= MAX_NUM && count < w * h; ++ i ) { if( pr[i] ) { ++ count; for( int j = i + i; j <= MAX_NUM; j += i ) pr[j] = 0; } } // printf( "%d", count ); int x0 = 0, y0 = 0, x1 = w - 1, y1 = h - 1; int prime = 1; while( x0 <= x1 || y0 <= y1 ) { if( y0 <= y1 ) { for( int x = x0; x <= x1; ++ x ) ans[y0][x] = next(prime); ++ y0; } if( x0 <= x1 ) { for( int y = y0; y <= y1; ++ y ) ans[y][x1] = next(prime); -- x1; } if( y0 <= y1 ) { for( int x = x1; x >= x0; -- x ) ans[y1][x] = next(prime); -- y1; } if( x0 <= x1 ) { for( int y = y1; y >= y0; -- y ) ans[y][x0] = next(prime); ++ x0; } } for( int i = 0; i < h; ++ i ) { printf( "%d", ans[i][0] ); for( int j = 1; j < w; ++ j ) printf( " %d", ans[i][j] ); printf( "\n" ); } return 0; }