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
/// Radoslaw Mysliwiec 2020
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

//using namespace __gnu_pbds;
using namespace std;

#define F first
#define S second
#define PB push_back
#define ALL(x) (x).begin(),(x).end()
#define endl '\n'
#define dd cout << " debug";

using ll = long long;
using ld = long double;
using vi = vector<int>;
using vll = vector<ll>;
using pi = pair<int,int>;
using pll = pair<ll,ll>;
using matrix = vector<vll>;
//using ordered_set = tree<pi, null_type, less<pi>, rb_tree_tag, tree_order_statistics_node_update>;

ll dp[100][100][100], n, m, p, res;

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n >> m >> p;

    vector< vector<vll> > dp(n+1, vector<vll>
                            (m+1, vll
                            (m+1, 0)));

    for (int i=1; i<=m; ++i) {
        for (int j=i; j<=m; ++j) {
            dp[1][i][j] = 1;
        }
    }
    for (int i=2; i<=n; ++i) {
        for (int L=1; L<=m; ++L) {
            for (int R=L; R<=m; ++R) {
                for (int l=1; l<=m; ++l) {
                    for (int r=l; r<=m; ++r) {
                        if (l <= R && r >= L) {
                            dp[i][L][R] += dp[i-1][l][r];
                            dp[i][L][R] %= p;
                        }
                    }
                }
            }
        }
    }

    for (int i=1; i<=m; ++i) {
        for (int j=i; j<=m; ++j) {
            res += dp[n][i][j];
            res %= p;
        }
    }
    cout << res << endl;
}