#include <bits/stdc++.h>
using namespace std;

#define WAS_SEEN(x) ( (seen[(x)>>5] >> ((x)&31)) & 1 )
#define MARK_SEEN(x) seen[(x)>>5] |= 1u << ((x)&31)

unsigned oned[1<<16];       // log2 of one-dimensional SG values
unsigned seen[(1<<27)+1];   // which SG values were already seen in this pass?
unsigned dp[2][1<<16];      // dp[x mod 2][y] = xor of rectangle (x,y)--(rr,cc)
unsigned precomputed[17][17];

int main() {
    for (int i=0; i<(1<<16); ++i) { 
        oned[i] = 0; 
        while ((i+1) % (1 << (oned[i]+1)) == 0) oned[i] += 1; 
    }
    for (int r=0; r<=16; ++r) for (int c=r; c<=16; ++c) { 
        int rr=(1<<r)-1, cc=(1<<c)-1;
        cout << "computing SG(" << rr << "," << cc << ")" << endl;
        memset(seen,0,sizeof(seen));
        memset(dp,0,sizeof(dp));

        MARK_SEEN(0); // toggling just the single cell
        for (int y=cc-1; y>=0; --y) { 
            dp[rr&1][y] = dp[rr&1][y+1] ^ precomputed[ oned[rr] ][ oned[y] ]; 
            MARK_SEEN( dp[rr&1][y] );
        }
        for (int x=rr-1; x>=0; --x) {
            int cur=x&1, prev=1-cur;
            dp[cur][cc] = dp[prev][cc] ^ precomputed[ oned[x] ][ oned[cc] ];
            MARK_SEEN( dp[cur][cc] );
            for (int y=cc-1; y>=0; --y) {
                dp[cur][y] = dp[cur][y+1] ^ dp[prev][y] ^ dp[prev][y+1] 
                             ^ precomputed[ oned[x] ][ oned[y] ];
                MARK_SEEN( dp[cur][y] );
            }
        }
        precomputed[r][c] = 0;
        while (WAS_SEEN(precomputed[r][c])) ++precomputed[r][c];
        precomputed[c][r] = precomputed[r][c];
        cout << precomputed[r][c] << endl; 
    }
}