#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 = 1000000000LL;
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+CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCiNkZWZpbmUgb2lvaSBwcmludGYoIm9pb2lcbiIpCiNkZWZpbmUgZW9xIGNvdXQgPDwgImVvcSIgPDwgJ1xuJwojZGVmaW5lIENMUyB3aGlsZSAoZ2V0Y2hhciAoKSAhPSAnXG4nKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgbGw7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBsbHU7CnR5cGVkZWYgcGFpcjxkb3VibGUsIGRvdWJsZT4gZGQ7CnR5cGVkZWYgdmVjdG9yPGxsPiB2aTsKY29uc3QgaW50IGR4W10gPSB7IDAsIDEsIC0xLCAwLCAxLCAtMSwgLTEsICAxfTsKY29uc3QgaW50IGR5W10gPSB7LTEsIDAsICAwLCAxLCAxLCAgMSwgLTEsIC0xfTsKY29uc3QgbGwgTU9EID0gMTMwMDAzMTsKY29uc3QgbGwgSU5GID0gMTAwMDAwMDAwMExMOwpjb25zdCBsbCBMTElORiA9IDFlMTggKyAxMDsKI2RlZmluZSBNQVhOIDIwMDAxMAoKc3RydWN0IHB2eyAvLyBwdiBwb3JxdWUgZWggdW1hIHN0cnVjdCBwcmEgcG9udG8gZSB2ZXRvci4KCglkb3VibGUgeCwgeTsKCXB2KCl7eD15PTAuMDt9Cglwdihkb3VibGUgYSwgZG91YmxlIGIpIDogeChhKSwgeShiKSB7fQoJCglwdiBvcGVyYXRvciAtIChwdiBnKXsgLy8gc3VidHJhaSBkb2lzIHBvbnRvcyBBIGUgQiBjcmlhbmRvIG8gdmV0b3IgQUIKCQoJCXJldHVybiBwdih4LWcueCwgeS1nLnkpOwoJfQoJCgkKCXB2IG9wZXJhdG9yICsgKHB2IHUpeyAvLyBhbmRhIGNvbSBvIHBvbnRvIG5vIHZldG9yIHUKCQoJCXJldHVybiBwdih4K3UueCwgeSt1LnkpOwoJfQoJCgkKCXB2IG9wZXJhdG9yICogKGRvdWJsZSBrKXsgLy9tdWx0aXBsaWNhY2FvIGRvIHZldG9yIHBvciB1bSBlc2NhbGFyIGsKCQlyZXR1cm4gcHYoeCprLCB5KmspOwoJfQoJCgkKCWJvb2wgb3BlcmF0b3IgPCAocHYgZykgY29uc3R7IC8vb3BlcmF0b3IgPCBwcmEgcG9udG9zLiBOZWNlc3NhcmlvIHByYSBvcmRlbmFyIG9jbSBhIGZ1bmNhbyBzb3J0CgkJaWYoZy54ICE9IHgpIHJldHVybiB4IDwgZy54OwoJCXJldHVybiB5IDwgZy55OwoJfQoKfTsKCgpkb3VibGUgZG90KHB2IGEsIHB2IGIpey8vcHJvZHV0byBlc2NhbGFyIChkb3QgcHJvZHVjdCkKCS8vIGEgZSBiIHNhbyB2ZXRvcmVzCglyZXR1cm4gYS54KmIueCArIGEueSpiLnk7Ly8gc2UgYSBlIGIgc2FvIG8gbWVzbW8gdmV0b3IsIG8gcmVzdWx0YWRvIHZhaSBzZXIgYSBub3JtYSBkZSBhIGFvIHF1YWRyYWRvOiB8YXxeMgp9Cgpkb3VibGUgY3Jvc3MocHYgYSwgcHYgYil7Ly9wcm9kdXRvIHZldG9yaWFsIChjcm9zcyBwcm9kdWN0KQoJLy8gYSBlIGIgc2FvIHZldG9yZXMKCXJldHVybiAgICBhLngqYi55IC0gYS55KmIueDsKfQoKYm9vbCB0YV9kZW50cm8ocHYgYXUsIHB2IGFwKXsKCWRvdWJsZSBjID0gY3Jvc3MoYXUsIGFwKTsKCWRvdWJsZSBhbnMgPSAoZG90KGF1LCBhcCkqMS4wIC8gZG90KGF1LCBhdSkpOwoJcmV0dXJuIGM9PTAgJiYgYW5zID4gMCAmJiBhbnMgPCAxOwp9CgppbnQgTiwgSzsKdmVjdG9yPHBhaXI8aW50LCBpbnQ+ID4gdjsKCnN0cnVjdCBtYXR7CglsbCB2WzIyNl1bMjI2XTsKCW1hdCgpewoJCW1lbXNldCh2LCAwLCBzaXplb2Ygdik7Cgl9CgltYXQgb3BlcmF0b3IgKiAobWF0IG90aGVyKXsKCQltYXQgYW5zOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgTipOOyBpKyspCgkJewoJCQlmb3IgKGludCBqID0gMDsgaiA8IE4qTjsgaisrKQoJCQl7CgkJCQlmb3IgKGludCBrID0gMDsgayA8IE4qTjsgaysrKQoJCQkJewoJCQkJCWFucy52W2ldW2pdICs9ICh2W2ldW2tdICogb3RoZXIudltrXVtqXSk7CgkJCQkJaWYoYW5zLnZbaV1bal0gPiBJTkYpIGFucy52W2ldW2pdICU9IE1PRDsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gYW5zOwoJfQp9OwoKbWF0IGJhc2UsIHJldDsKCm1hdCBleHBvbmVuY2lhKGludCBleHApewoJaWYoZXhwPT0wKSByZXR1cm4gcmV0OwoJbWF0IGF1eCA9IGV4cG9uZW5jaWEoZXhwLzIpOwoJYXV4ID0gYXV4KmF1eDsKCWlmKGV4cCUyKSBhdXggPSBhdXgqYmFzZTsKCXJldHVybiBhdXg7Cn0KCmludCBtYWluKCl7CglwdiBhLCBiLCBjOwoJcHYgYWIsIGFjOwoJCgkvL34gYSA9IHB2KDQsIDQpOwoJLy9+IGIgPSBwdigpOwoJLy9+IGMgPSBwdigpOwoJCgkvL34gYWIgPSBiLWE7CgkvL34gYWMgPSBjLWE7CgkKCQoJCgkvL34gaWYodGFfZGVudHJvKGFiLCBhYykpIGNvdXQgPDwgImRlbnRyb1xuIjsKCS8vfiBlbHNlIGNvdXQgPDwgImZvcmFcbiI7CgkKCWZvciAoaW50IGkgPSAwOyBpIDwgMjI2OyBpKyspCgl7CgkJcmV0LnZbaV1baV0gPSAxOwoJCQoJfQoJCglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvICgwKTsKCWNpbi50aWUgKDApOwoJCQoJd2hpbGUgKGNpbiA+PiBOID4+IEssIE4hPTApCgl7CgkJdi5jbGVhcigpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQoJCXsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspCgkJCXsKCQkJCWludCB4ID0gajsKCQkJCWludCB5ID0gTi1pLTE7CgkJCQl2LnBiKG1wKHgsIHkpKTsKCQkJfQoJCX0KCQkKCQkvL34gZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKQoJCS8vfiB7CgkJCS8vfiBjb3V0IDw8IHZbaV0uRiA8PCAiICIgPDwgdltpXS5TIDw8IGVuZGw7CgkJLy9+IH0KCQkKCQliYXNlID0gbWF0KCk7CgkJYm9vbCBlcnJvOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykKCQl7CgkJCWZvciAoaW50IGogPSBpKzE7IGogPCB2LnNpemUoKTsgaisrKQoJCQl7CgkJCQllcnJvPWZhbHNlOwoJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB2LnNpemUoKTsgaysrKQoJCQkJewoJCQkJCS8vfiBpZihrPT1pIHx8IGs9PWopIGNvbnRpbnVlOwoJCQkJCWEgPSBwdih2W2ldLkYsIHZbaV0uUyk7CgkJCQkJYiA9IHB2KHZbal0uRiwgdltqXS5TKTsKCQkJCQljID0gcHYodltrXS5GLCB2W2tdLlMpOwoJCQkJCWFiID0gYi1hOwoJCQkJCWFjID0gYy1hOwoJCQkJCWlmKHRhX2RlbnRybyhhYiwgYWMpKXsKCQkJCQkJZXJybz10cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlpZighZXJybykgYmFzZS52W2ldW2pdID0gYmFzZS52W2pdW2ldID0gMTsKCQkJfQoJCX0KCQkKCQltYXQgYW5zID0gZXhwb25lbmNpYShLLTEpOwoJCWxsIHN1bSA9IDBMTDsKCQlmb3IgKGludCBpID0gMDsgaSA8IE4qTjsgaSsrKQoJCXsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBOKk47IGorKykKCQkJewoJCQkJc3VtICs9IGFucy52W2ldW2pdOwoJCQkJaWYoc3VtPklORikgc3VtJT1NT0Q7CgkJCX0KCQl9CgkJY291dCA8PCBzdW0lTU9EIDw8ICJcbiI7CgkJCgl9CgkKCQoJcmV0dXJuIDA7Cn0K