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
// Życie ze mna gra w pokera raz zabiera raz zabiera
// Może pyknie na 1 pkt i ten promil na koszulke pyknie
#include <iostream>

using namespace std;
const int MAXN = 1000;
const int MAXK = 10;
// tablice przechowujące koleno przetwarzane wartosci
long long tab[MAXN + 5][MAXK + 5];

void init () {
    tab[3][2] = 2;
    tab[4][2] = 16;
    tab[5][2] = 100;
    tab[6][2] = 616;
    tab[7][2] = 4024;
    tab[8][2] = 28512;
    tab[9][2] = 219664;
    tab[10][2] = 1831712;
    tab[11][2] = 16429152;
    tab[12][2] = 157552000;


    tab[5][3] = 4;
    tab[6][3] = 72;
    tab[7][3] = 952;
    tab[8][3] = 11680;
    tab[9][3] = 142800;
    tab[10][3] = 1788896;
    tab[11][3] = 23252832;
    tab[12][3] = 315549312;

    tab[9][4] = 160;
    tab[10][4] = 7680;
    tab[11][4] = 233792;
    tab[12][4] = 5898240;

    tab[2][1] = 2;
    for (int i = 3; i <= MAXN; ++i) {
        tab[i][1] = tab[i-1][1] * 2;
    }
}

int P, N, K;

int main() {
    init();
    cin >> N >> K >> P;
    if (K > 10) {
        cout << "0" << endl;
        return 0;
    }
    if (N == 1) {
        cout << "1" << endl;
        return 0;
    }
    cout << tab[N][K] % P << endl;
    return 0;
}