#include <bits/stdc++.h> using namespace std; int dp[2][450000][145]; int main() { //ios_base::sync_with_stdio(false); //cin.tie(NULL); long long n, m, mod; cin>>n>>m>>mod; if (n==1) { long long odp=m*(m+1); odp>>=1; cout<<odp%mod; return 0; } /*else if (m==2) { }*/ for (int i=1; i<=m; i++) for (int j=i; j<=m; j++) dp[0][i][j]=1; for (int i=2; i<=n; i++) { if (!(i&1)) { for (int j=1; j<=m; j++) { for (int l=j; l<=m; l++) { dp[1][j][l]=0; for (int p=1; p<=l; p++) { for (int k=max(j, p); k<=m; k++) { dp[1][j][l]+=dp[0][p][k]; // cout<<dp[1][j][l]<<" "<<dp[0][p][k]<<endl; dp[1][j][l]%=mod; } } } } } else { for (int j=1; j<=m; j++) { for (int l=j; l<=m; l++) { dp[0][j][l]=0; for (int p=1; p<=l; p++) { for (int k=max(j, p); k<=m; k++) { dp[0][j][l]+=dp[1][p][k]; // cout<<dp[1][j][l]<<" "<<dp[0][p][k]<<endl; dp[0][j][l]%=mod; } } } } } } /*for (int i=2; i<=n; i++) { for (int j=1; j<=m; j++) { dp[i][j]=dp[i-1][j]*dp[1][j]; dp[i][j]%=p; } }*/ long long odp=0; if (!(n&1)) for (int i=1; i<=m; i++) for (int j=i; j<=m; j++) odp+=(long long)dp[1][i][j]; else for (int i=1; i<=m; i++) for (int j=i; j<=m; j++) odp+=(long long)dp[0][i][j]; odp%=mod; cout<<odp<<"\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 | #include <bits/stdc++.h> using namespace std; int dp[2][450000][145]; int main() { //ios_base::sync_with_stdio(false); //cin.tie(NULL); long long n, m, mod; cin>>n>>m>>mod; if (n==1) { long long odp=m*(m+1); odp>>=1; cout<<odp%mod; return 0; } /*else if (m==2) { }*/ for (int i=1; i<=m; i++) for (int j=i; j<=m; j++) dp[0][i][j]=1; for (int i=2; i<=n; i++) { if (!(i&1)) { for (int j=1; j<=m; j++) { for (int l=j; l<=m; l++) { dp[1][j][l]=0; for (int p=1; p<=l; p++) { for (int k=max(j, p); k<=m; k++) { dp[1][j][l]+=dp[0][p][k]; // cout<<dp[1][j][l]<<" "<<dp[0][p][k]<<endl; dp[1][j][l]%=mod; } } } } } else { for (int j=1; j<=m; j++) { for (int l=j; l<=m; l++) { dp[0][j][l]=0; for (int p=1; p<=l; p++) { for (int k=max(j, p); k<=m; k++) { dp[0][j][l]+=dp[1][p][k]; // cout<<dp[1][j][l]<<" "<<dp[0][p][k]<<endl; dp[0][j][l]%=mod; } } } } } } /*for (int i=2; i<=n; i++) { for (int j=1; j<=m; j++) { dp[i][j]=dp[i-1][j]*dp[1][j]; dp[i][j]%=p; } }*/ long long odp=0; if (!(n&1)) for (int i=1; i<=m; i++) for (int j=i; j<=m; j++) odp+=(long long)dp[1][i][j]; else for (int i=1; i<=m; i++) for (int j=i; j<=m; j++) odp+=(long long)dp[0][i][j]; odp%=mod; cout<<odp<<"\n"; return 0; } |