#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;
}