#include <iostream>
#include <vector>
using namespace std;
long long n, m, p;
vector<vector<int>> dp;
vector<vector<int>> prefsum;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> p;
dp.resize(n);
prefsum.resize(n);
for(int i = 0; i < n; i++) dp[i].resize(m), prefsum[i].resize(m);
for(int i = 0; i < m; i++) dp[0][i] = i + 1;
prefsum[0][0] = 1;
for(int i = 1; i < m; i++) prefsum[0][i] = prefsum[0][i - 1] + dp[0][i];
for(int k = 1; k < n; k++){
long long dg = 0;
for(long long i = 0; i < m; i++){
long long base = (i + 1) * (prefsum[k - 1][m - 1]) - (i + 1) * (i == m - 1 ? 0 : prefsum[k - 1][m - 2 - i]); base %= p;
dp[k][i] = (base - dg + p) % p;
dg = (dg + prefsum[k - 1][i]) % p;
}
prefsum[k][0] = dp[k][0];
for(long long i = 1; i < m; i++) prefsum[k][i] = (prefsum[k][i - 1] + dp[k][i]) % p;
}
cout << prefsum[n - 1][m - 1] << "\n";
}
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 | #include <iostream> #include <vector> using namespace std; long long n, m, p; vector<vector<int>> dp; vector<vector<int>> prefsum; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m >> p; dp.resize(n); prefsum.resize(n); for(int i = 0; i < n; i++) dp[i].resize(m), prefsum[i].resize(m); for(int i = 0; i < m; i++) dp[0][i] = i + 1; prefsum[0][0] = 1; for(int i = 1; i < m; i++) prefsum[0][i] = prefsum[0][i - 1] + dp[0][i]; for(int k = 1; k < n; k++){ long long dg = 0; for(long long i = 0; i < m; i++){ long long base = (i + 1) * (prefsum[k - 1][m - 1]) - (i + 1) * (i == m - 1 ? 0 : prefsum[k - 1][m - 2 - i]); base %= p; dp[k][i] = (base - dg + p) % p; dg = (dg + prefsum[k - 1][i]) % p; } prefsum[k][0] = dp[k][0]; for(long long i = 1; i < m; i++) prefsum[k][i] = (prefsum[k][i - 1] + dp[k][i]) % p; } cout << prefsum[n - 1][m - 1] << "\n"; } |
English