1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include<cstdio>

int n, m, p;

void input() {
  scanf("%d %d %d\n", &n, &m, &p);
}

int * t1s;
int * t1e;

bool inside(int x, int x2, int y2) {
  return x2 <= x && y2 >= x;
}

bool intersect(int x1, int y1, int x2, int y2) {
  return inside(x1, x2, y2) || inside(y1, x2, y2) || inside(x2, x1, y1) || inside(y2, x1, y1);
}

int brute1(int k) {
  if (k == n) {
    // printf("\n");
    // for (int i = 0; i < m; i++) {
    //   for (int j = 0; j < n; j++) {
    //     if (t1s[j] <= i && t1e[j] >= i) {
    //       printf("#");
    //     } else {
    //       printf(" ");
    //     }
    //   }
    //   printf("\n");
    // }
    return 1;
  }
  int res = 0;
  for (int i = 0; i < m; i++) {
    for (int j = i; j < m; j++) {
      if (k == 0 || intersect(t1s[k - 1], t1e[k - 1], i, j)) {
        t1s[k] = i;
        t1e[k] = j;
        // printf("%d %d %d\n", k, i , j);
        res += brute1(k + 1);
      }
    }
  }
  // printf("%d %d\n", k, res);
  return res;
}

int brute1() {
  t1s = new int[n];
  t1e = new int[n];
  return brute1(0);
}

// x = i * m + j
long long brute2() {
  int coef[m * m][m * m];
  for (int i = 0; i < m * m; i++) {
    for (int j = 0; j < m * m; j++) {
      coef[i][j] = 0;
    }
  }
  int d[2][m * m];
  for (int i1 = 0; i1 < m; i1++) {
    for (int j1 = i1; j1 < m; j1++) {
      for (int i2 = 0; i2 < m; i2++) {
        for (int j2 = i2; j2 < m; j2++) {
          if (intersect(i1, j1, i2, j2)) {
            coef[i2 * m + j2][i1 * m + j1] = 1;
          } else {
            coef[i2 * m + j2][i1 * m + j1] = 0;
          }
        }
      }
    }
  }
  // for (int i = 0; i < m * m; i++) {
  //   for (int j = 0; j < m * m; j++) {
  //     printf("%d ", coef[i][j]);
  //   }
  //   printf("\n");
  // }
  for (int i = 0; i < m * m; i++) {
    d[0][i] = 1;
  }
  for (int i = 1; i < n; i++) {
    int k = i % 2;
    int l = 1 - k;
    for (int j = 0; j < m * m; j++) {
      d[k][j] = 0;
      d[l][j] %= p;
    }
    for (int i1 = 0; i1 < m; i1++) {
      for (int j1 = i1; j1 < m; j1++) {
        for (int i2 = 0; i2 < m; i2++) {
          for (int j2 = 0; j2 < m; j2++) {
            d[k][i1 * m + j1] += (coef[i1 * m + j1][i2 * m + j2] * (long long) d[l][i2 * m + j2]) % p;
          }
        }
      }
    }
  }
  long long res = 0;
  for (int i = 0; i < m * m; i++) {
    res = (res + d[(n + 1) % 2][i]) % p;
  }
  return res;
}

int main() {
  input();
  // printf("%d\n", brute1() % p);
  printf("%lld\n", brute2() % p);
  return 0;
}