#include <bits/stdc++.h> using namespace std; vector<pair<int, int>> common[1010][1010]; long long dp[2][1010][1010]; void print(int m) { for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { cout << dp[0][i][j] << " " << dp[1][i][j] << endl; } } cout << endl; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, prime; cin >> n >> m >> prime; if(m == 1) { cout << 1 << "\n"; return 0; } long long m2 = m; if(n == 1) { cout << (m2*(m2+1)/2)%prime << "\n"; return 0; } for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { for(int k = 0; k < m; k++) { for(int l = k; l < m; l++) { if(l >= i && k <= j) { common[i][j].push_back({k, l}); } } } } } // for(int i = 0; i < m; i++) { // for(int j = i; j < m; j++) { // for(auto k: common[i][j]) { // cout << k.first << " " << k.second << endl; // } // cout << endl; // } // } // return 0; for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { dp[0][i][j] = 1; } } int prev, curr; for(int i = 0; i < n-1; i++) { prev = i%2; curr = 1-prev; for(int j = 0; j < m; j++) { for(int k = j; k < m; k++) { dp[curr][j][k] = 0; } } for(int j = 0; j < m; j++) { for(int k = j; k < m; k++) { long long mult = dp[prev][j][k]; for(auto l: common[j][k]) { dp[curr][l.first][l.second] += mult; dp[curr][l.first][l.second] %= prime; } } } } long long r = 0; for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { r += dp[curr][i][j]; r %= prime; } } cout << r << "\n"; 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 96 97 98 99 100 | #include <bits/stdc++.h> using namespace std; vector<pair<int, int>> common[1010][1010]; long long dp[2][1010][1010]; void print(int m) { for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { cout << dp[0][i][j] << " " << dp[1][i][j] << endl; } } cout << endl; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, prime; cin >> n >> m >> prime; if(m == 1) { cout << 1 << "\n"; return 0; } long long m2 = m; if(n == 1) { cout << (m2*(m2+1)/2)%prime << "\n"; return 0; } for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { for(int k = 0; k < m; k++) { for(int l = k; l < m; l++) { if(l >= i && k <= j) { common[i][j].push_back({k, l}); } } } } } // for(int i = 0; i < m; i++) { // for(int j = i; j < m; j++) { // for(auto k: common[i][j]) { // cout << k.first << " " << k.second << endl; // } // cout << endl; // } // } // return 0; for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { dp[0][i][j] = 1; } } int prev, curr; for(int i = 0; i < n-1; i++) { prev = i%2; curr = 1-prev; for(int j = 0; j < m; j++) { for(int k = j; k < m; k++) { dp[curr][j][k] = 0; } } for(int j = 0; j < m; j++) { for(int k = j; k < m; k++) { long long mult = dp[prev][j][k]; for(auto l: common[j][k]) { dp[curr][l.first][l.second] += mult; dp[curr][l.first][l.second] %= prime; } } } } long long r = 0; for(int i = 0; i < m; i++) { for(int j = i; j < m; j++) { r += dp[curr][i][j]; r %= prime; } } cout << r << "\n"; return 0; } |