#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <array>
using namespace std;
#ifdef USE_CERR_LOG
#define LOG if (true) cerr
const bool LogEnabled = true;
#else
#define LOG if (false) cerr
const bool LogEnabled = false;
#endif
bool LogBigEnabled = true;
#ifdef USE_FILE_CIN
ifstream fin("mal.in");
#define cin fin
#endif
typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
ll plankCount, plankLength, prime;
void readData() {
ios_base::sync_with_stdio(false);
cin >> plankCount >> plankLength >> prime;
}
void solve() {
int i, j, k, l;
vector<vector<ll>> prevCounts, counts;
prevCounts.resize(plankLength);
counts.resize(plankLength);
for (i = 0; i < plankLength; i++) {
prevCounts[i].resize(plankLength + 1);
counts[i].resize(plankLength + 1);
for (j = i + 1; j <= plankLength; j++) {
prevCounts[i][j] = 1;
}
}
for (int a = 1; a < plankCount; a++) {
for (i = 0; i < plankLength; i++) {
for (j = i + 1; j <= plankLength; j++) {
ll count = 0;
for (k = 0; k < j; k++) {
for (l = i+1; l <= plankLength; l++) {
count = (count + prevCounts[k][l]) % prime;
}
}
counts[i][j] = count;
}
}
swap(counts, prevCounts);
}
ll result = 0;
for (i = 0; i < plankLength; i++) {
for (j = i + 1; j <= plankLength; j++) {
result = (result + prevCounts[i][j]) % prime;
}
}
cout << result;
}
int main() {
readData();
if (plankCount == 1) {
cout << (plankLength * (plankLength + 1)) / 2 % prime;
return 0;
} else if (plankLength == 1) {
cout << 1;
return 0;
} else {
solve();
}
return 0;
}
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 | #include <iostream> #include <fstream> #include <vector> #include <string> #include <queue> #include <array> using namespace std; #ifdef USE_CERR_LOG #define LOG if (true) cerr const bool LogEnabled = true; #else #define LOG if (false) cerr const bool LogEnabled = false; #endif bool LogBigEnabled = true; #ifdef USE_FILE_CIN ifstream fin("mal.in"); #define cin fin #endif typedef unsigned uint; typedef long long ll; typedef unsigned long long ull; ll plankCount, plankLength, prime; void readData() { ios_base::sync_with_stdio(false); cin >> plankCount >> plankLength >> prime; } void solve() { int i, j, k, l; vector<vector<ll>> prevCounts, counts; prevCounts.resize(plankLength); counts.resize(plankLength); for (i = 0; i < plankLength; i++) { prevCounts[i].resize(plankLength + 1); counts[i].resize(plankLength + 1); for (j = i + 1; j <= plankLength; j++) { prevCounts[i][j] = 1; } } for (int a = 1; a < plankCount; a++) { for (i = 0; i < plankLength; i++) { for (j = i + 1; j <= plankLength; j++) { ll count = 0; for (k = 0; k < j; k++) { for (l = i+1; l <= plankLength; l++) { count = (count + prevCounts[k][l]) % prime; } } counts[i][j] = count; } } swap(counts, prevCounts); } ll result = 0; for (i = 0; i < plankLength; i++) { for (j = i + 1; j <= plankLength; j++) { result = (result + prevCounts[i][j]) % prime; } } cout << result; } int main() { readData(); if (plankCount == 1) { cout << (plankLength * (plankLength + 1)) / 2 % prime; return 0; } else if (plankLength == 1) { cout << 1; return 0; } else { solve(); } return 0; } |
English