import java.util.Arrays;
public class ChessMetric {
static long[][][] mem;
static int num, s, e [];
public static long howMany(int size, int[] start, int[] end, int numMoves)
{
mem = new long[size + 1][size + 1][numMoves+1];
for(long [][] i:mem)
for(long[]j:i)
e = end;
s = size;
num = numMoves;
return dp(start[0], start[1], num);
}
static int [] dx = {0,1,0,-1,1,1,-1,-1, 2,-2,2,-2, 1,-1,1,-1};
static int [] dy = {1,0,-1,0,1,-1,1,-1, 1,1,-1,-1, 2,2,-2,-2};
static long dp(int i, int j, int n)
{
if (n == 0)
return i == e[0] && j == e[1]?1:0;
if(mem[i][j][n] != -1)
return mem[i][j][n];
long ans = 0;
for (int k = 0; k < dx.length; k++)
{
int nx = i + dx[k], ny = j + dy[k];
if(nx >= 0 && ny >= 0 && nx < s && ny < s)
ans += dp(nx, ny, n-1);
}
return mem[i][j][n] = ans;
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CgpwdWJsaWMgY2xhc3MgQ2hlc3NNZXRyaWMgewogICAgc3RhdGljIGxvbmdbXVtdW10gbWVtOwogICAgc3RhdGljIGludCBudW0sIHMsIGUgW107CgogICAgcHVibGljIHN0YXRpYyBsb25nIGhvd01hbnkoaW50IHNpemUsIGludFtdIHN0YXJ0LCBpbnRbXSBlbmQsIGludCBudW1Nb3ZlcykKICAgIHsKCW1lbSA9IG5ldyBsb25nW3NpemUgKyAxXVtzaXplICsgMV1bbnVtTW92ZXMrMV07Cglmb3IobG9uZyBbXVtdIGk6bWVtKQoJICAgIGZvcihsb25nW11qOmkpCgkJQXJyYXlzLmZpbGwoaiwgLTEpOwoJZSA9IGVuZDsKCXMgPSBzaXplOwoJbnVtID0gbnVtTW92ZXM7CglyZXR1cm4gZHAoc3RhcnRbMF0sIHN0YXJ0WzFdLCBudW0pOwogICAgfQogICAgc3RhdGljIGludCBbXSBkeCA9IHswLDEsMCwtMSwxLDEsLTEsLTEsIDIsLTIsMiwtMiwgMSwtMSwxLC0xfTsKICAgIHN0YXRpYyBpbnQgW10gZHkgPSB7MSwwLC0xLDAsMSwtMSwxLC0xLCAxLDEsLTEsLTEsIDIsMiwtMiwtMn07CiAgICBzdGF0aWMgbG9uZyBkcChpbnQgaSwgaW50IGosIGludCBuKQogICAgewoJaWYgKG4gPT0gMCkKCSAgICByZXR1cm4gaSA9PSBlWzBdICYmIGogPT0gZVsxXT8xOjA7CglpZihtZW1baV1bal1bbl0gIT0gLTEpCgkgICAgcmV0dXJuIG1lbVtpXVtqXVtuXTsKCWxvbmcgYW5zID0gMDsKCWZvciAoaW50IGsgPSAwOyBrIDwgZHgubGVuZ3RoOyBrKyspCgl7CgkgICAgaW50IG54ID0gaSArIGR4W2tdLCBueSA9IGogKyBkeVtrXTsKCSAgICBpZihueCA+PSAwICYmIG55ID49IDAgJiYgbnggPCBzICYmIG55IDwgcykKCQlhbnMgKz0gZHAobngsIG55LCBuLTEpOwoJfQoJcmV0dXJuIG1lbVtpXVtqXVtuXSA9IGFuczsKICAgIH0KfQ==