#include <bits/stdc++.h> //#define int long long #define mp make_pair #define pb push_back #define ld long double #define ll long long #define pii pair<int,int> #define sz(x) (int)x.size() #define piii pair<pii,pii> #define precise cout<<fixed<<setprecision(10) #define st first #define nd second #define ins insert #define vi vector<int> #define BOOST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; int n,m,mod; void add(int &a,int b){ a+=b; while (a>=mod)a-=mod; } void sub(int &a,int b){ a-=b; while (a<0)a+=mod; } int32_t main(){ BOOST; cin>>n>>m>>mod; vector<vi>dppref; // do gory vector<vi>dpsuf; // do dolu vector<vi>suf; dppref.resize(n+1); dpsuf.resize(n+1); suf.resize(n+1); for (int i=0;i<=n;i++){ dppref[i].resize(m+2); dpsuf[i].resize(m+2); suf[i].resize(m+2); for (int j=0;j<=m+1;j++){ dppref[i][j]=0; dpsuf[i][j]=0; suf[i][j]=0; } } for (int i=1;i<=m;i++){ dppref[1][i]=i; dpsuf[1][i]=m-i+1; } for (int i=2;i<=n;i++){ int presum=0; for (int j=1;j<=m;j++)add(presum,dppref[i-1][j]); int pref=0; for (int j=m;j>=1;j--){ add(suf[i][j],dpsuf[i-1][j]); if (j<=m-1)add(suf[i][j],suf[i][j+1]); } int odejmij=0; for (int j=1;j<=m;j++){ int odejmij2=0; dppref[i][j]=((ll)j*presum)%mod; if (j>=2){ add(pref,dppref[i-1][j-1]); add(odejmij,pref); } if (j!=m){ add(odejmij2,((ll)j*suf[i][j+1])%mod); } add(odejmij,odejmij2); //cout<<"XDXD "<<i<<" "<<j<<" "<<(j*presum)%mod<<" "<<pref<<" "<<(j*suf[i][j+1])%mod<<" "<<odejmij<<" "<<odejmij2<<"\n"; sub(dppref[i][j],odejmij); sub(odejmij,odejmij2); } for (int j=1;j<=m;j++){ dpsuf[i][j]=dppref[i][m-j+1]; } } /* for (int i=1;i<=n;i++){ for (int j=1;j<=m;j++){ cout<<dppref[i][j]<<" "; } cout<<"\n"; } */ int ans=0; for (int i=1;i<=m;i++){ add(ans,dppref[n][i]); } cout<<ans; 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 | #include <bits/stdc++.h> //#define int long long #define mp make_pair #define pb push_back #define ld long double #define ll long long #define pii pair<int,int> #define sz(x) (int)x.size() #define piii pair<pii,pii> #define precise cout<<fixed<<setprecision(10) #define st first #define nd second #define ins insert #define vi vector<int> #define BOOST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; int n,m,mod; void add(int &a,int b){ a+=b; while (a>=mod)a-=mod; } void sub(int &a,int b){ a-=b; while (a<0)a+=mod; } int32_t main(){ BOOST; cin>>n>>m>>mod; vector<vi>dppref; // do gory vector<vi>dpsuf; // do dolu vector<vi>suf; dppref.resize(n+1); dpsuf.resize(n+1); suf.resize(n+1); for (int i=0;i<=n;i++){ dppref[i].resize(m+2); dpsuf[i].resize(m+2); suf[i].resize(m+2); for (int j=0;j<=m+1;j++){ dppref[i][j]=0; dpsuf[i][j]=0; suf[i][j]=0; } } for (int i=1;i<=m;i++){ dppref[1][i]=i; dpsuf[1][i]=m-i+1; } for (int i=2;i<=n;i++){ int presum=0; for (int j=1;j<=m;j++)add(presum,dppref[i-1][j]); int pref=0; for (int j=m;j>=1;j--){ add(suf[i][j],dpsuf[i-1][j]); if (j<=m-1)add(suf[i][j],suf[i][j+1]); } int odejmij=0; for (int j=1;j<=m;j++){ int odejmij2=0; dppref[i][j]=((ll)j*presum)%mod; if (j>=2){ add(pref,dppref[i-1][j-1]); add(odejmij,pref); } if (j!=m){ add(odejmij2,((ll)j*suf[i][j+1])%mod); } add(odejmij,odejmij2); //cout<<"XDXD "<<i<<" "<<j<<" "<<(j*presum)%mod<<" "<<pref<<" "<<(j*suf[i][j+1])%mod<<" "<<odejmij<<" "<<odejmij2<<"\n"; sub(dppref[i][j],odejmij); sub(odejmij,odejmij2); } for (int j=1;j<=m;j++){ dpsuf[i][j]=dppref[i][m-j+1]; } } /* for (int i=1;i<=n;i++){ for (int j=1;j<=m;j++){ cout<<dppref[i][j]<<" "; } cout<<"\n"; } */ int ans=0; for (int i=1;i<=m;i++){ add(ans,dppref[n][i]); } cout<<ans; return 0; } |