Задача №1901. ???

#include <cassert>
#include <cstdio>
#include <cstring>

const int MaxN = 10, MaxK = 1 << MaxN;

long long f [2] [MaxK];
int k, m, n;

int main (void)
{
  int b, i, j, l;
  while (scanf (" %d %d", &m, &n) != EOF)
  {
    assert (1 <= m && m <= MaxN);
    assert (1 <= n && n <= MaxN);
    k = 1 << m;
    b = 0;
    memset (f[b], 0, sizeof (f[b]));
    f[b][0] = 1;
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
      {
        b = !b;
        memset (f[b], 0, sizeof (f[b]));
        for (l = 0; l < k; l++)
        if (f[!b][l])
        {
          f[b][l ^ (1 << j)] += f[!b][l];
          if (j + 1 < n && !(l & (5 << j)))
            f[b][l | (2 << j)] += f[!b][l];
        }
      }
    printf ("%lld\n", f[b][0]);
  }
  return 0;
}
Примеры
Входные данные
1 1
Выходные данные
0
Входные данные
2 3
Выходные данные
3
Сдать: для сдачи задач необходимо войти в систему