fork(1) download
#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;
}
Success #stdin #stdout 0.06s 12520KB
stdin
8 1
8 2
8 3
8 4
8 5
8 6
8 7
8 8
8 9
8 10
8 11
8 12
0 0
stdout
64
2564
102828
223491
260435
1293300
535016
239886
1299891
898113
998654
194128