#include<iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long p, up, left, upleft, val;
int n, m, x, y, curr;
cin >> n >> m >> p;
if(n == 1) {
cout << (long long)m*(long long)(m+1)/2 << "\n";
return 0;
}
long long dp[m][m][2];
for(x = 0; x < m; x++) {
for(y = 0; y < m; y++) {
left = ((x == 0) ? 0 : dp[x-1][y][0]);
up = ((y == 0) ? 0 : dp[x][y-1][0]);
upleft = ((x == 0 || y == 0) ? 0 : dp[x-1][y-1][0]);
dp[x][y][0] = ((x <= y) + left + up - upleft) % p;
}
}
for(int i = 1; i < n; i++) {
curr = (i&1);
for(int x = 0; x < m; x++) {
for(int y = 0; y < m; y++) {
left = ((x == 0) ? 0 : dp[x-1][y][curr]);
up = ((y == 0) ? 0 : dp[x][y-1][curr]);
upleft = ((x == 0 || y == 0) ? 0 : dp[x-1][y-1][curr]);
if(x <= y) {
if(x == 0) {
val = dp[y][m-1][!curr];
}
else {
val = (dp[y][m-1][!curr]-dp[y][x-1][!curr])%p;
}
}
else {
val = 0;
}
dp[x][y][curr] = (up+left-upleft+val)%p;
}
}
}
cout << dp[m-1][m-1][curr] << "\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 | #include<iostream> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long p, up, left, upleft, val; int n, m, x, y, curr; cin >> n >> m >> p; if(n == 1) { cout << (long long)m*(long long)(m+1)/2 << "\n"; return 0; } long long dp[m][m][2]; for(x = 0; x < m; x++) { for(y = 0; y < m; y++) { left = ((x == 0) ? 0 : dp[x-1][y][0]); up = ((y == 0) ? 0 : dp[x][y-1][0]); upleft = ((x == 0 || y == 0) ? 0 : dp[x-1][y-1][0]); dp[x][y][0] = ((x <= y) + left + up - upleft) % p; } } for(int i = 1; i < n; i++) { curr = (i&1); for(int x = 0; x < m; x++) { for(int y = 0; y < m; y++) { left = ((x == 0) ? 0 : dp[x-1][y][curr]); up = ((y == 0) ? 0 : dp[x][y-1][curr]); upleft = ((x == 0 || y == 0) ? 0 : dp[x-1][y-1][curr]); if(x <= y) { if(x == 0) { val = dp[y][m-1][!curr]; } else { val = (dp[y][m-1][!curr]-dp[y][x-1][!curr])%p; } } else { val = 0; } dp[x][y][curr] = (up+left-upleft+val)%p; } } } cout << dp[m-1][m-1][curr] << "\n"; return 0; } |
English