#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
#define cr(a, b, x, y) case a: return CellCoord{b, x, y}
#define SIDENUM 3 //количество сторон куба которые хранятся
#define MAX_L 51 //максимальное значение L
#define BASE 1000000000 //10^9, основание системы счисления для длинной арифметики
#define DNUM 9 //количество цифр 10-ичной системы счисления в 1 "цифре" длинной арифметики
struct LongNum {
//реализация длинной арифметики на векторах со сложением и выводом
vector<int> v;
LongNum() {} //стандартный конструктор
LongNum(int s) { //конструктор из int
v.push_back(s);
}
void print() { //вывод числа
cout <<(v.empty() ? 0 : v.back());
for (int i = (int)v.size() - 2; i>=0; i--)
cout <<setfill('0') <<setw(DNUM) <<v[i];
}
void add(LongNum term) { //прибавление длинного числа
auto b = term.v;
int carry = 0;
for (size_t i = 0; i < max(v.size(), b.size()) || carry; i++) {
if (i == v.size())
v.push_back(0);
v[i] += carry + (i < b.size() ? b[i] : 0);
carry = v[i] >= BASE;
if (carry) v[i] -= BASE;
}
}
};
struct CellCoord {
//хранит данные о положении клетки
short side;
short x, y;
};
struct CellNeighbors {
//хранит данные о положении всех(4) соседей определённой клетки
CellCoord n[4];
};
CellCoord FixNeighbor(short l, short side, short x, short y) {
//исправляет данные о положении клетки, если она выходит за края грани
if(x == -1) { //если сосед находится левее грани
switch(side) {
//если координаты выходят за левую границу 0-ой грани - меняет грань на 1-ую,
//обнуляя y, а в x записывает старый y
cr(0, 1, y, 0); //и так далее
cr(1, 1, l-1, y);
cr(2, 1, l-y-1, l-1);
}
} else if(x == l) {//правее
switch(side) {
cr(0, 1, l-y-1, 0);
cr(1, 1, 0, y);
cr(2, 1, y, l-1);
}
} else if(y == -1) {//выше
switch(side) {
cr(0, 1, l-x-1, 0);
cr(1, 0, x, l-1);
cr(2, 1, x, l-1);
}
} else if(y == l) {//ниже
switch(side) {
cr(0, 1, x, 0);
cr(1, 2, x, 0);
cr(2, 1, l-x-1, l-1);
}
} else {
// если координаты не вышли за границы грани просто возвращаем неизменённые координаты
return CellCoord{side, x, y};
}
}
CellNeighbors GetNeighbors(short l, short side, short x, short y) {
//возвращает исправленные координаты всех(4) соседних клеток
return CellNeighbors{{
FixNeighbor(l, side, x-1, y),
FixNeighbor(l, side, x+1, y),
FixNeighbor(l, side, x, y-1),
FixNeighbor(l, side, x, y+1)
}};
}
int main() {
short l, m;
bool flag = false;
cin >>l >>m;
LongNum cubes[2][SIDENUM][MAX_L][MAX_L];
cubes[0][0][l/2][l/2] = LongNum(1);
//за 0 ходов можно дойти 1 путём в изначальную точку
CellNeighbors nbs[SIDENUM][MAX_L][MAX_L];
//массив координат соседей
for(short side=0; side<SIDENUM; side++) {
for(short xi=0; xi<l; xi++) {
for(short yi=0; yi<l; yi++) { //перебор координат всех клеток
nbs[side][xi][yi] = GetNeighbors(l, side, xi, yi);
//кэш координат соседних клеток
}
}
}
for(short i=0; i<m; i++) {
for(short side=0; side<SIDENUM; side++) {
for(short xi=0; xi<l; xi++) {
for(short yi=0; yi<l; yi++) { //перебор всех клеток
LongNum neighbor_sum;
for(auto e: nbs[side][xi][yi].n) { //перебор всех соседей
neighbor_sum.add(cubes[flag][e.side][e.x][e.y]);
//сложение количества путей ко всем соседям на предыдущем шаге
}
cubes[!flag][side][xi][yi] = neighbor_sum;
//запись получившейся суммы в клетку
}
}
}
flag = !flag; //замена местами массива для предыдущего шага и нынешнего
}
cubes[flag][1][l/2][l/2].print();
//вывод количества путей к центру соседней грани на m-ом шаге
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAojZGVmaW5lIGNyKGEsIGIsIHgsIHkpIGNhc2UgYTogcmV0dXJuIENlbGxDb29yZHtiLCB4LCB5fQojZGVmaW5lIFNJREVOVU0gMyAvL9C60L7Qu9C40YfQtdGB0YLQstC+INGB0YLQvtGA0L7QvSDQutGD0LHQsCDQutC+0YLQvtGA0YvQtSDRhdGA0LDQvdGP0YLRgdGPCiNkZWZpbmUgTUFYX0wgNTEgLy/QvNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSBMCiAKI2RlZmluZSBCQVNFIDEwMDAwMDAwMDAgLy8xMF45LCDQvtGB0L3QvtCy0LDQvdC40LUg0YHQuNGB0YLQtdC80Ysg0YHRh9C40YHQu9C10L3QuNGPINC00LvRjyDQtNC70LjQvdC90L7QuSDQsNGA0LjRhNC80LXRgtC40LrQuCAKI2RlZmluZSBETlVNIDkgLy/QutC+0LvQuNGH0LXRgdGC0LLQviDRhtC40YTRgCAxMC3QuNGH0L3QvtC5INGB0LjRgdGC0LXQvNGLINGB0YfQuNGB0LvQtdC90LjRjyDQsiAxICLRhtC40YTRgNC1IiDQtNC70LjQvdC90L7QuSDQsNGA0LjRhNC80LXRgtC40LrQuAogCnN0cnVjdCBMb25nTnVtIHsKICAgIC8v0YDQtdCw0LvQuNC30LDRhtC40Y8g0LTQu9C40L3QvdC+0Lkg0LDRgNC40YTQvNC10YLQuNC60Lgg0L3QsCDQstC10LrRgtC+0YDQsNGFINGB0L4g0YHQu9C+0LbQtdC90LjQtdC8INC4INCy0YvQstC+0LTQvtC8CiAgICB2ZWN0b3I8aW50PiB2OwogICAgTG9uZ051bSgpIHt9IC8v0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDQutC+0L3RgdGC0YDRg9C60YLQvtGACiAgICBMb25nTnVtKGludCBzKSB7IC8v0LrQvtC90YHRgtGA0YPQutGC0L7RgCDQuNC3IGludAogICAgICAgIHYucHVzaF9iYWNrKHMpOwogICAgfQogICAgdm9pZCBwcmludCgpIHsgLy/QstGL0LLQvtC0INGH0LjRgdC70LAKICAgICAgICBjb3V0IDw8KHYuZW1wdHkoKSA/IDAgOiB2LmJhY2soKSk7CiAgICAgICAgZm9yIChpbnQgaSA9IChpbnQpdi5zaXplKCkgLSAyOyBpPj0wOyBpLS0pCiAgICAgICAgICAgIGNvdXQgPDxzZXRmaWxsKCcwJykgPDxzZXR3KEROVU0pIDw8dltpXTsKICAgIH0KICAgIHZvaWQgYWRkKExvbmdOdW0gdGVybSkgeyAvL9C/0YDQuNCx0LDQstC70LXQvdC40LUg0LTQu9C40L3QvdC+0LPQviDRh9C40YHQu9CwCiAgICAgICAgYXV0byBiID0gdGVybS52OwogICAgICAgIGludCBjYXJyeSA9IDA7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXgodi5zaXplKCksIGIuc2l6ZSgpKSB8fCBjYXJyeTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpID09IHYuc2l6ZSgpKQogICAgICAgICAgICAgICAgdi5wdXNoX2JhY2soMCk7CiAgICAgICAgICAgIHZbaV0gKz0gY2FycnkgKyAoaSA8IGIuc2l6ZSgpID8gYltpXSA6IDApOwogICAgICAgICAgICBjYXJyeSA9IHZbaV0gPj0gQkFTRTsKICAgICAgICAgICAgaWYgKGNhcnJ5KSAgdltpXSAtPSBCQVNFOwogICAgICAgIH0KICAgIH0KfTsKIApzdHJ1Y3QgQ2VsbENvb3JkIHsKICAgIC8v0YXRgNCw0L3QuNGCINC00LDQvdC90YvQtSDQviDQv9C+0LvQvtC20LXQvdC40Lgg0LrQu9C10YLQutC4CiAgICBzaG9ydCBzaWRlOwogICAgc2hvcnQgeCwgeTsKfTsKIApzdHJ1Y3QgQ2VsbE5laWdoYm9ycyB7CiAgICAvL9GF0YDQsNC90LjRgiDQtNCw0L3QvdGL0LUg0L4g0L/QvtC70L7QttC10L3QuNC4INCy0YHQtdGFKDQpINGB0L7RgdC10LTQtdC5INC+0L/RgNC10LTQtdC70ZHQvdC90L7QuSDQutC70LXRgtC60LgKICAgIENlbGxDb29yZCBuWzRdOwp9OwogCkNlbGxDb29yZCBGaXhOZWlnaGJvcihzaG9ydCBsLCBzaG9ydCBzaWRlLCBzaG9ydCB4LCBzaG9ydCB5KSB7CiAgICAvL9C40YHQv9GA0LDQstC70Y/QtdGCINC00LDQvdC90YvQtSDQviDQv9C+0LvQvtC20LXQvdC40Lgg0LrQu9C10YLQutC4LCDQtdGB0LvQuCDQvtC90LAg0LLRi9GF0L7QtNC40YIg0LfQsCDQutGA0LDRjyDQs9GA0LDQvdC4CiAgICBpZih4ID09IC0xKSB7IC8v0LXRgdC70Lgg0YHQvtGB0LXQtCDQvdCw0YXQvtC00LjRgtGB0Y8g0LvQtdCy0LXQtSDQs9GA0LDQvdC4CiAgICAgICAgc3dpdGNoKHNpZGUpIHsKICAgICAgICAvL9C10YHQu9C4INC60L7QvtGA0LTQuNC90LDRgtGLINCy0YvRhdC+0LTRj9GCINC30LAg0LvQtdCy0YPRjiDQs9GA0LDQvdC40YbRgyAwLdC+0Lkg0LPRgNCw0L3QuCAtINC80LXQvdGP0LXRgiDQs9GA0LDQvdGMINC90LAgMS3Rg9GOLAogICAgICAgIC8v0L7QsdC90YPQu9GP0Y8geSwg0LAg0LIgeCDQt9Cw0L/QuNGB0YvQstCw0LXRgiDRgdGC0LDRgNGL0LkgeSAKICAgICAgICBjcigwLCAxLCB5LCAgICAgMCk7IC8v0Lgg0YLQsNC6INC00LDQu9C10LUKICAgICAgICBjcigxLCAxLCBsLTEsICAgeSk7CiAgICAgICAgY3IoMiwgMSwgbC15LTEsIGwtMSk7CiAgICAgICAgfQogICAgfSBlbHNlIGlmKHggPT0gbCkgey8v0L/RgNCw0LLQtdC1CiAgICAgICAgc3dpdGNoKHNpZGUpIHsKICAgICAgICBjcigwLCAxLCBsLXktMSwgMCk7CiAgICAgICAgY3IoMSwgMSwgMCwgICAgIHkpOwogICAgICAgIGNyKDIsIDEsIHksICAgICBsLTEpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZih5ID09IC0xKSB7Ly/QstGL0YjQtQogICAgICAgIHN3aXRjaChzaWRlKSB7CiAgICAgICAgY3IoMCwgMSwgbC14LTEsIDApOwogICAgICAgIGNyKDEsIDAsIHgsICAgICBsLTEpOwogICAgICAgIGNyKDIsIDEsIHgsICAgICBsLTEpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZih5ID09IGwpIHsvL9C90LjQttC1CiAgICAgICAgc3dpdGNoKHNpZGUpIHsKICAgICAgICBjcigwLCAxLCB4LCAgICAgMCk7CiAgICAgICAgY3IoMSwgMiwgeCwgICAgIDApOwogICAgICAgIGNyKDIsIDEsIGwteC0xLCBsLTEpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8g0LXRgdC70Lgg0LrQvtC+0YDQtNC40L3QsNGC0Ysg0L3QtSDQstGL0YjQu9C4INC30LAg0LPRgNCw0L3QuNGG0Ysg0LPRgNCw0L3QuCDQv9GA0L7RgdGC0L4g0LLQvtC30LLRgNCw0YnQsNC10Lwg0L3QtdC40LfQvNC10L3RkdC90L3Ri9C1INC60L7QvtGA0LTQuNC90LDRgtGLCiAgICAgICAgcmV0dXJuIENlbGxDb29yZHtzaWRlLCB4LCB5fTsKICAgIH0KfQogCkNlbGxOZWlnaGJvcnMgR2V0TmVpZ2hib3JzKHNob3J0IGwsIHNob3J0IHNpZGUsIHNob3J0IHgsIHNob3J0IHkpIHsKICAgIC8v0LLQvtC30LLRgNCw0YnQsNC10YIg0LjRgdC/0YDQsNCy0LvQtdC90L3Ri9C1INC60L7QvtGA0LTQuNC90LDRgtGLINCy0YHQtdGFKDQpINGB0L7RgdC10LTQvdC40YUg0LrQu9C10YLQvtC6CiAgICByZXR1cm4gQ2VsbE5laWdoYm9yc3t7CiAgICAgICAgRml4TmVpZ2hib3IobCwgc2lkZSwgeC0xLCB5KSwKICAgICAgICBGaXhOZWlnaGJvcihsLCBzaWRlLCB4KzEsIHkpLAogICAgICAgIEZpeE5laWdoYm9yKGwsIHNpZGUsIHgsIHktMSksCiAgICAgICAgRml4TmVpZ2hib3IobCwgc2lkZSwgeCwgeSsxKQogICAgfX07Cn0KIAppbnQgbWFpbigpIHsKICAgIHNob3J0IGwsIG07CiAgICBib29sIGZsYWcgPSBmYWxzZTsKICAgIGNpbiA+PmwgPj5tOwogICAgTG9uZ051bSBjdWJlc1syXVtTSURFTlVNXVtNQVhfTF1bTUFYX0xdOwogCiAgICBjdWJlc1swXVswXVtsLzJdW2wvMl0gPSBMb25nTnVtKDEpOwogICAgLy/Qt9CwIDAg0YXQvtC00L7QsiDQvNC+0LbQvdC+INC00L7QudGC0LggMSDQv9GD0YLRkdC8INCyINC40LfQvdCw0YfQsNC70YzQvdGD0Y4g0YLQvtGH0LrRgwogCiAgICBDZWxsTmVpZ2hib3JzIG5ic1tTSURFTlVNXVtNQVhfTF1bTUFYX0xdOwogICAgLy/QvNCw0YHRgdC40LIg0LrQvtC+0YDQtNC40L3QsNGCINGB0L7RgdC10LTQtdC5CiAKICAgIGZvcihzaG9ydCBzaWRlPTA7IHNpZGU8U0lERU5VTTsgc2lkZSsrKSB7CiAgICAgICAgZm9yKHNob3J0IHhpPTA7IHhpPGw7IHhpKyspIHsKICAgICAgICAgICAgZm9yKHNob3J0IHlpPTA7IHlpPGw7IHlpKyspIHsgLy/Qv9C10YDQtdCx0L7RgCDQutC+0L7RgNC00LjQvdCw0YIg0LLRgdC10YUg0LrQu9C10YLQvtC6CiAgICAgICAgICAgICAgICBuYnNbc2lkZV1beGldW3lpXSA9IEdldE5laWdoYm9ycyhsLCBzaWRlLCB4aSwgeWkpOwogICAgICAgICAgICAgICAgLy/QutGN0Ygg0LrQvtC+0YDQtNC40L3QsNGCINGB0L7RgdC10LTQvdC40YUg0LrQu9C10YLQvtC6CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAKICAgIGZvcihzaG9ydCBpPTA7IGk8bTsgaSsrKSB7CiAgICAgICAgZm9yKHNob3J0IHNpZGU9MDsgc2lkZTxTSURFTlVNOyBzaWRlKyspIHsKICAgICAgICAgICAgZm9yKHNob3J0IHhpPTA7IHhpPGw7IHhpKyspIHsKICAgICAgICAgICAgICAgIGZvcihzaG9ydCB5aT0wOyB5aTxsOyB5aSsrKSB7IC8v0L/QtdGA0LXQsdC+0YAg0LLRgdC10YUg0LrQu9C10YLQvtC6CiAgICAgICAgICAgICAgICAgICAgTG9uZ051bSBuZWlnaGJvcl9zdW07CiAgICAgICAgICAgICAgICAgICAgZm9yKGF1dG8gZTogbmJzW3NpZGVdW3hpXVt5aV0ubikgeyAvL9C/0LXRgNC10LHQvtGAINCy0YHQtdGFINGB0L7RgdC10LTQtdC5CiAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yX3N1bS5hZGQoY3ViZXNbZmxhZ11bZS5zaWRlXVtlLnhdW2UueV0pOwogICAgICAgICAgICAgICAgICAgICAgICAvL9GB0LvQvtC20LXQvdC40LUg0LrQvtC70LjRh9C10YHRgtCy0LAg0L/Rg9GC0LXQuSDQutC+INCy0YHQtdC8INGB0L7RgdC10LTRj9C8INC90LAg0L/RgNC10LTRi9C00YPRidC10Lwg0YjQsNCz0LUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3ViZXNbIWZsYWddW3NpZGVdW3hpXVt5aV0gPSBuZWlnaGJvcl9zdW07CiAgICAgICAgICAgICAgICAgICAgLy/Qt9Cw0L/QuNGB0Ywg0L/QvtC70YPRh9C40LLRiNC10LnRgdGPINGB0YPQvNC80Ysg0LIg0LrQu9C10YLQutGDCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmxhZyA9ICFmbGFnOyAvL9C30LDQvNC10L3QsCDQvNC10YHRgtCw0LzQuCDQvNCw0YHRgdC40LLQsCDQtNC70Y8g0L/RgNC10LTRi9C00YPRidC10LPQviDRiNCw0LPQsCDQuCDQvdGL0L3QtdGI0L3QtdCz0L4KICAgIH0KICAgIGN1YmVzW2ZsYWddWzFdW2wvMl1bbC8yXS5wcmludCgpOwogICAgLy/QstGL0LLQvtC0INC60L7Qu9C40YfQtdGB0YLQstCwINC/0YPRgtC10Lkg0Log0YbQtdC90YLRgNGDINGB0L7RgdC10LTQvdC10Lkg0LPRgNCw0L3QuCDQvdCwIG0t0L7QvCDRiNCw0LPQtQp9