#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define oioi printf("oioi\n")
#define eoq cout << "eoq" << '\n'
#define CLS while (getchar () != '\n')
using namespace std;
typedef long long int ll;
typedef unsigned long long int llu;
typedef pair<double, double> dd;
typedef vector<ll> vi;
const int dx[] = { 0, 1, -1, 0, 1, -1, -1, 1};
const int dy[] = {-1, 0, 0, 1, 1, 1, -1, -1};
const ll MOD = 1300031;
const ll INF = 100000000000LL;
const ll LLINF = 1e18 + 10;
#define MAXN 200010
struct pv{ // pv porque eh uma struct pra ponto e vetor.
double x, y;
pv(){x=y=0.0;}
pv(double a, double b) : x(a), y(b) {}
pv operator - (pv g){ // subtrai dois pontos A e B criando o vetor AB
return pv(x-g.x, y-g.y);
}
pv operator + (pv u){ // anda com o ponto no vetor u
return pv(x+u.x, y+u.y);
}
pv operator * (double k){ //multiplicacao do vetor por um escalar k
return pv(x*k, y*k);
}
bool operator < (pv g) const{ //operator < pra pontos. Necessario pra ordenar ocm a funcao sort
if(g.x != x) return x < g.x;
return y < g.y;
}
};
double dot(pv a, pv b){//produto escalar (dot product)
// a e b sao vetores
return a.x*b.x + a.y*b.y;// se a e b sao o mesmo vetor, o resultado vai ser a norma de a ao quadrado: |a|^2
}
double cross(pv a, pv b){//produto vetorial (cross product)
// a e b sao vetores
return a.x*b.y - a.y*b.x;
}
bool ta_dentro(pv au, pv ap){
double c = cross(au, ap);
double ans = (dot(au, ap)*1.0 / dot(au, au));
return c==0 && ans > 0 && ans < 1;
}
int N, K;
vector<pair<int, int> > v;
struct mat{
ll v[226][226];
mat(){
memset(v, 0, sizeof v);
}
mat operator * (mat other){
mat ans;
for (int i = 0; i < N*N; i++)
{
for (int j = 0; j < N*N; j++)
{
for (int k = 0; k < N*N; k++)
{
ans.v[i][j] += (v[i][k] * other.v[k][j]);
if(ans.v[i][j] > INF) ans.v[i][j] %= MOD;
}
}
}
return ans;
}
};
mat base, ret;
mat exponencia(int exp){
if(exp==0) return ret;
mat aux = exponencia(exp/2);
aux = aux*aux;
if(exp%2) aux = aux*base;
return aux;
}
int main(){
pv a, b, c;
pv ab, ac;
//~ a = pv(4, 4);
//~ b = pv();
//~ c = pv();
//~ ab = b-a;
//~ ac = c-a;
//~ if(ta_dentro(ab, ac)) cout << "dentro\n";
//~ else cout << "fora\n";
for (int i = 0; i < 226; i++)
{
ret.v[i][i] = 1;
}
ios_base::sync_with_stdio (0);
cin.tie (0);
while (cin >> N >> K, N!=0)
{
v.clear();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
int x = j;
int y = N-i-1;
v.pb(mp(x, y));
}
}
//~ for (int i = 0; i < v.size(); i++)
//~ {
//~ cout << v[i].F << " " << v[i].S << endl;
//~ }
base = mat();
bool erro;
for (int i = 0; i < v.size(); i++)
{
for (int j = i+1; j < v.size(); j++)
{
erro=false;
for (int k = 0; k < v.size(); k++)
{
//~ if(k==i || k==j) continue;
a = pv(v[i].F, v[i].S);
b = pv(v[j].F, v[j].S);
c = pv(v[k].F, v[k].S);
ab = b-a;
ac = c-a;
if(ta_dentro(ab, ac)){
erro=true;
break;
}
}
if(!erro) base.v[i][j] = base.v[j][i] = 1;
}
}
mat ans = exponencia(K-1);
ll sum = 0LL;
for (int i = 0; i < N*N; i++)
{
for (int j = 0; j < N*N; j++)
{
sum += ans.v[i][j];
if(sum>INF) sum%=MOD;
}
}
cout << sum%MOD << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCiNkZWZpbmUgb2lvaSBwcmludGYoIm9pb2lcbiIpCiNkZWZpbmUgZW9xIGNvdXQgPDwgImVvcSIgPDwgJ1xuJwojZGVmaW5lIENMUyB3aGlsZSAoZ2V0Y2hhciAoKSAhPSAnXG4nKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgbGw7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBsbHU7CnR5cGVkZWYgcGFpcjxkb3VibGUsIGRvdWJsZT4gZGQ7CnR5cGVkZWYgdmVjdG9yPGxsPiB2aTsKY29uc3QgaW50IGR4W10gPSB7IDAsIDEsIC0xLCAwLCAxLCAtMSwgLTEsICAxfTsKY29uc3QgaW50IGR5W10gPSB7LTEsIDAsICAwLCAxLCAxLCAgMSwgLTEsIC0xfTsKY29uc3QgbGwgTU9EID0gMTMwMDAzMTsKY29uc3QgbGwgSU5GID0gMTAwMDAwMDAwMDAwTEw7CmNvbnN0IGxsIExMSU5GID0gMWUxOCArIDEwOwojZGVmaW5lIE1BWE4gMjAwMDEwCgpzdHJ1Y3QgcHZ7IC8vIHB2IHBvcnF1ZSBlaCB1bWEgc3RydWN0IHByYSBwb250byBlIHZldG9yLgoKCWRvdWJsZSB4LCB5OwoJcHYoKXt4PXk9MC4wO30KCXB2KGRvdWJsZSBhLCBkb3VibGUgYikgOiB4KGEpLCB5KGIpIHt9CgkKCXB2IG9wZXJhdG9yIC0gKHB2IGcpeyAvLyBzdWJ0cmFpIGRvaXMgcG9udG9zIEEgZSBCIGNyaWFuZG8gbyB2ZXRvciBBQgoJCgkJcmV0dXJuIHB2KHgtZy54LCB5LWcueSk7Cgl9CgkKCQoJcHYgb3BlcmF0b3IgKyAocHYgdSl7IC8vIGFuZGEgY29tIG8gcG9udG8gbm8gdmV0b3IgdQoJCgkJcmV0dXJuIHB2KHgrdS54LCB5K3UueSk7Cgl9CgkKCQoJcHYgb3BlcmF0b3IgKiAoZG91YmxlIGspeyAvL211bHRpcGxpY2FjYW8gZG8gdmV0b3IgcG9yIHVtIGVzY2FsYXIgawoJCXJldHVybiBwdih4KmssIHkqayk7Cgl9CgkKCQoJYm9vbCBvcGVyYXRvciA8IChwdiBnKSBjb25zdHsgLy9vcGVyYXRvciA8IHByYSBwb250b3MuIE5lY2Vzc2FyaW8gcHJhIG9yZGVuYXIgb2NtIGEgZnVuY2FvIHNvcnQKCQlpZihnLnggIT0geCkgcmV0dXJuIHggPCBnLng7CgkJcmV0dXJuIHkgPCBnLnk7Cgl9Cgp9OwoKCmRvdWJsZSBkb3QocHYgYSwgcHYgYil7Ly9wcm9kdXRvIGVzY2FsYXIgKGRvdCBwcm9kdWN0KQoJLy8gYSBlIGIgc2FvIHZldG9yZXMKCXJldHVybiBhLngqYi54ICsgYS55KmIueTsvLyBzZSBhIGUgYiBzYW8gbyBtZXNtbyB2ZXRvciwgbyByZXN1bHRhZG8gdmFpIHNlciBhIG5vcm1hIGRlIGEgYW8gcXVhZHJhZG86IHxhfF4yCn0KCmRvdWJsZSBjcm9zcyhwdiBhLCBwdiBiKXsvL3Byb2R1dG8gdmV0b3JpYWwgKGNyb3NzIHByb2R1Y3QpCgkvLyBhIGUgYiBzYW8gdmV0b3JlcwoJcmV0dXJuICAgIGEueCpiLnkgLSBhLnkqYi54Owp9Cgpib29sIHRhX2RlbnRybyhwdiBhdSwgcHYgYXApewoJZG91YmxlIGMgPSBjcm9zcyhhdSwgYXApOwoJZG91YmxlIGFucyA9IChkb3QoYXUsIGFwKSoxLjAgLyBkb3QoYXUsIGF1KSk7CglyZXR1cm4gYz09MCAmJiBhbnMgPiAwICYmIGFucyA8IDE7Cn0KCmludCBOLCBLOwp2ZWN0b3I8cGFpcjxpbnQsIGludD4gPiB2OwoKc3RydWN0IG1hdHsKCWxsIHZbMjI2XVsyMjZdOwoJbWF0KCl7CgkJbWVtc2V0KHYsIDAsIHNpemVvZiB2KTsKCX0KCW1hdCBvcGVyYXRvciAqIChtYXQgb3RoZXIpewoJCW1hdCBhbnM7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBOKk47IGkrKykKCQl7CgkJCWZvciAoaW50IGogPSAwOyBqIDwgTipOOyBqKyspCgkJCXsKCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgTipOOyBrKyspCgkJCQl7CgkJCQkJYW5zLnZbaV1bal0gKz0gKHZbaV1ba10gKiBvdGhlci52W2tdW2pdKTsKCQkJCQlpZihhbnMudltpXVtqXSA+IElORikgYW5zLnZbaV1bal0gJT0gTU9EOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBhbnM7Cgl9Cn07CgptYXQgYmFzZSwgcmV0OwoKbWF0IGV4cG9uZW5jaWEoaW50IGV4cCl7CglpZihleHA9PTApIHJldHVybiByZXQ7CgltYXQgYXV4ID0gZXhwb25lbmNpYShleHAvMik7CglhdXggPSBhdXgqYXV4OwoJaWYoZXhwJTIpIGF1eCA9IGF1eCpiYXNlOwoJcmV0dXJuIGF1eDsKfQoKaW50IG1haW4oKXsKCXB2IGEsIGIsIGM7CglwdiBhYiwgYWM7CgkKCS8vfiBhID0gcHYoNCwgNCk7CgkvL34gYiA9IHB2KCk7CgkvL34gYyA9IHB2KCk7CgkKCS8vfiBhYiA9IGItYTsKCS8vfiBhYyA9IGMtYTsKCQoJCgkKCS8vfiBpZih0YV9kZW50cm8oYWIsIGFjKSkgY291dCA8PCAiZGVudHJvXG4iOwoJLy9+IGVsc2UgY291dCA8PCAiZm9yYVxuIjsKCQoJZm9yIChpbnQgaSA9IDA7IGkgPCAyMjY7IGkrKykKCXsKCQlyZXQudltpXVtpXSA9IDE7CgkJCgl9CgkKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8gKDApOwoJY2luLnRpZSAoMCk7CgkJCgl3aGlsZSAoY2luID4+IE4gPj4gSywgTiE9MCkKCXsKCQl2LmNsZWFyKCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCgkJewoJCQlmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykKCQkJewoJCQkJaW50IHggPSBqOwoJCQkJaW50IHkgPSBOLWktMTsKCQkJCXYucGIobXAoeCwgeSkpOwoJCQl9CgkJfQoJCQoJCS8vfiBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspCgkJLy9+IHsKCQkJLy9+IGNvdXQgPDwgdltpXS5GIDw8ICIgIiA8PCB2W2ldLlMgPDwgZW5kbDsKCQkvL34gfQoJCQoJCWJhc2UgPSBtYXQoKTsKCQlib29sIGVycm87CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKQoJCXsKCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHYuc2l6ZSgpOyBqKyspCgkJCXsKCQkJCWVycm89ZmFsc2U7CgkJCQlmb3IgKGludCBrID0gMDsgayA8IHYuc2l6ZSgpOyBrKyspCgkJCQl7CgkJCQkJLy9+IGlmKGs9PWkgfHwgaz09aikgY29udGludWU7CgkJCQkJYSA9IHB2KHZbaV0uRiwgdltpXS5TKTsKCQkJCQliID0gcHYodltqXS5GLCB2W2pdLlMpOwoJCQkJCWMgPSBwdih2W2tdLkYsIHZba10uUyk7CgkJCQkJYWIgPSBiLWE7CgkJCQkJYWMgPSBjLWE7CgkJCQkJaWYodGFfZGVudHJvKGFiLCBhYykpewoJCQkJCQllcnJvPXRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCFlcnJvKSBiYXNlLnZbaV1bal0gPSBiYXNlLnZbal1baV0gPSAxOwoJCQl9CgkJfQoJCQoJCW1hdCBhbnMgPSBleHBvbmVuY2lhKEstMSk7CgkJbGwgc3VtID0gMExMOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgTipOOyBpKyspCgkJewoJCQlmb3IgKGludCBqID0gMDsgaiA8IE4qTjsgaisrKQoJCQl7CgkJCQlzdW0gKz0gYW5zLnZbaV1bal07CgkJCQlpZihzdW0+SU5GKSBzdW0lPU1PRDsKCQkJfQoJCX0KCQljb3V0IDw8IHN1bSVNT0QgPDwgIlxuIjsKCQkKCX0KCQoJCglyZXR1cm4gMDsKfQo=