#include <bits/stdc++.h> using namespace std; const int MX=10100100; int n,m,md,i,j,cur,prv,res; long long lft[MX],rgh[MX],slft,srgh,sj; int main() { scanf("%d%d%d",&n,&m,&md); for (i=0; i<m; i++) { lft[i]=m-i; rgh[i]=i+1; } for (i=1; i<n; i++) { cur=i*m; prv=cur-m; slft=srgh=sj=0; for (j=1; j<=m; ++j, ++cur, ++prv) { slft+=lft[prv]; if (slft>=md) slft-=md; srgh+=rgh[prv]; if (srgh>=md) srgh-=md; sj=(sj+rgh[prv]*j)%md; rgh[cur]=(slft*j)%md; rgh[cur]-=(srgh*j+md-sj)%md; if (rgh[cur]<0) rgh[cur]+=md; } cur=(i+1)*m-1; prv=cur-m; slft=srgh=sj=0; for (j=1; j<=m; ++j, --cur, --prv) { slft+=lft[prv]; if (slft>=md) slft-=md; srgh+=rgh[prv]; if (srgh>=md) srgh-=md; sj=(sj+lft[prv]*j)%md; lft[cur]=(srgh*j)%md; lft[cur]-=(slft*j+md-sj)%md; if (lft[cur]<0) lft[cur]+=md; } } cur=n*m; for (j=1; j<=m; j++) { res+=lft[cur-j]; if (res>=md) res-=md; } printf("%d\n",res); 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 | #include <bits/stdc++.h> using namespace std; const int MX=10100100; int n,m,md,i,j,cur,prv,res; long long lft[MX],rgh[MX],slft,srgh,sj; int main() { scanf("%d%d%d",&n,&m,&md); for (i=0; i<m; i++) { lft[i]=m-i; rgh[i]=i+1; } for (i=1; i<n; i++) { cur=i*m; prv=cur-m; slft=srgh=sj=0; for (j=1; j<=m; ++j, ++cur, ++prv) { slft+=lft[prv]; if (slft>=md) slft-=md; srgh+=rgh[prv]; if (srgh>=md) srgh-=md; sj=(sj+rgh[prv]*j)%md; rgh[cur]=(slft*j)%md; rgh[cur]-=(srgh*j+md-sj)%md; if (rgh[cur]<0) rgh[cur]+=md; } cur=(i+1)*m-1; prv=cur-m; slft=srgh=sj=0; for (j=1; j<=m; ++j, --cur, --prv) { slft+=lft[prv]; if (slft>=md) slft-=md; srgh+=rgh[prv]; if (srgh>=md) srgh-=md; sj=(sj+lft[prv]*j)%md; lft[cur]=(srgh*j)%md; lft[cur]-=(slft*j+md-sj)%md; if (lft[cur]<0) lft[cur]+=md; } } cur=n*m; for (j=1; j<=m; j++) { res+=lft[cur-j]; if (res>=md) res-=md; } printf("%d\n",res); return 0; } |