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
// Artur Kraska, II UWr

#include <bits/stdc++.h>

#define forr(i, n)                  for(int i=0; i<n; i++)
#define FOREACH(iter, coll)         for(auto iter = coll.begin(); iter != coll.end(); ++iter)
#define FOREACHR(iter, coll)        for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter)
#define lbound(P,R,PRED)            ({typeof(P) X=P,RRR=(R), PPP = P; while(PPP<RRR) {X = (PPP+(RRR-PPP)/2); if(PRED) RRR = X; else PPP = X+1;} PPP;})
#define testy()                     int _tests; scanf("%d", &_tests); FOR(_test, 1, _tests)
#define CLEAR(tab)                  memset(tab, 0, sizeof(tab))
#define CONTAIN(el, coll)           (coll.find(el) != coll.end())
#define FOR(i, a, b)                for(int i=a; i<=b; i++)
#define FORD(i, a, b)               for(int i=a; i>=b; i--)
#define MP                          make_pair
#define PB                          push_back
#define ff                          first
#define ss                          second
#define deb(X)                      ;

#define M 1000000007
#define INF 1000000007LL

using namespace std;

int n, m;
long long p;
long long pom[100][100][100];
long long r[2][10000007];

long long brut()
{
    FOR(i, 1, m)
        FOR(j, i, m)
            pom[1][i][j] = 1;
    FOR(l, 2, n)
        FOR(i, 1, m)
            FOR(j, i, m)
                FOR(i2, 1, m)
                    FOR(j2, i2, m)
                        pom[l][i][j] += (j >= i2 && j2 >= i? 1 : 0)*pom[l-1][i2][j2];

    long long res = 0;
    FOR(l, 1, n)
    {
        deb(cout << "level " << l << endl);
        FOR(i, 1, m)
        {
            long long rr = 0;
            FOR(j, i, m)
            {
                /*
                FOR(k, 1, i-1)
                    cout << ".";
                FOR(k, i, j)
                    cout << "X";
                FOR(k, j+1, m)
                    cout << ".";
                cout << " daje wynik " << pom[l][i][j] << endl;
                */
                if(l == n)
                    res += pom[l][i][j];
                rr += pom[l][i][j];
            }
            deb(cout << " r[" << m-i+1 << "] = " << rr << endl);
        }
    }
    return res;
}

long long brut2()
{
    FOR(i, 1, m)
        r[1][i] = (i*((long long)i+1)/2)%p;
    int curr = 1;
    int opp = 0;
    FOR(ll, 2, n)
    {
        swap(curr, opp);
        long long s = 0;
        FOR(i, 1, m)
        {
            r[curr][i] = (r[curr][i-1] + i*(r[opp][m] + p - r[opp][m-i]) + p - s)%p;
            s = (s + r[opp][i])%p;
        }
    }

    return r[curr][m];
}

int main()
{
    scanf("%d %d %lld", &n, &m, &p);

    //printf("%lld\n", brut());

    printf("%lld\n", brut2());

    return 0;
}