#include <bits/stdc++.h>
#define boost \
ios_base::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0)
#define ll long long
#define int long long
#define st first
#define nd second
using namespace std;
const int N(1e6 + 13);
int n, q, m, prime, prefSum, myWays;
int **ways;
void initWays() {
ways = new int *[n + 13];
for (int i = 0; i <= n; i++) {
ways[i] = new int[m + 13];
}
}
int rangeSum(int n) { return n * (n + 1) / 2; }
int mod(int value) { return value % prime; }
int nMod(int value) { return value < 0 ? value + prime : value; }
int32_t main() {
boost;
cin >> n >> m >> prime;
initWays();
for (int i = 1; i <= m; i++) {
ways[1][i] = rangeSum(i);
}
for (int i = 2; i <= n; i++) {
prefSum = 0;
for (int j = 1; j <= m; j++) {
myWays = nMod(ways[i - 1][m] - ways[i - 1][m - j]);
myWays = mod(j * myWays);
myWays = mod(ways[i][j - 1] + myWays);
myWays = nMod(myWays - prefSum);
prefSum = mod(prefSum + ways[i - 1][j]);
ways[i][j] = myWays;
}
}
cout << ways[n][m] << endl;
/*
1592 6281 1000000007
*/
}
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 | #include <bits/stdc++.h> #define boost \ ios_base::sync_with_stdio(0); \ cin.tie(0); \ cout.tie(0) #define ll long long #define int long long #define st first #define nd second using namespace std; const int N(1e6 + 13); int n, q, m, prime, prefSum, myWays; int **ways; void initWays() { ways = new int *[n + 13]; for (int i = 0; i <= n; i++) { ways[i] = new int[m + 13]; } } int rangeSum(int n) { return n * (n + 1) / 2; } int mod(int value) { return value % prime; } int nMod(int value) { return value < 0 ? value + prime : value; } int32_t main() { boost; cin >> n >> m >> prime; initWays(); for (int i = 1; i <= m; i++) { ways[1][i] = rangeSum(i); } for (int i = 2; i <= n; i++) { prefSum = 0; for (int j = 1; j <= m; j++) { myWays = nMod(ways[i - 1][m] - ways[i - 1][m - j]); myWays = mod(j * myWays); myWays = mod(ways[i][j - 1] + myWays); myWays = nMod(myWays - prefSum); prefSum = mod(prefSum + ways[i - 1][j]); ways[i][j] = myWays; } } cout << ways[n][m] << endl; /* 1592 6281 1000000007 */ } |
English