// Marcin Knapik
// Potyczki Algorytmiczne
#pragma GCC optimize "O3"
#include<bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define ll long long
const int N = 1e7 + 700;
int suf[N][2];
int pref[N][2];
int suff[N];
int preff[N];
ll suma[2];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, mod;
cin >> n >> m >> mod;
bool bit = 0;
suma[0] = 1;
pref[m][0] = 1;
suf[1][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
preff[j] = preff[j - 1] + pref[j][bit];
if(preff[j] >= mod)
preff[j] -= mod;
}
for(int j = m; j >= 1; j--){
suff[j] = suff[j + 1] + suf[j][bit];
if(suff[j] >= mod)
suff[j] -= mod;
}
suma[bit ^ 1] = 0;
for(int j = 1; j <= m; j++){
pref[j][bit ^ 1] = (pref[j - 1][bit ^ 1] + suma[bit] - suff[j + 1] - preff[j - 1] + 1ll * (j - 1) * suf[j][bit] + mod + mod) % mod;
suma[bit ^ 1] += pref[j][bit ^ 1];
}
for(int j = m; j >= 1; j--)
suf[j][bit ^ 1] = (suf[j + 1][bit ^ 1] + suma[bit] - suff[j + 1] - preff[j - 1] + 1ll * (m - j) * pref[j][bit] + mod + mod) % mod;
bit ^= 1;
suma[bit] %= mod;
}
cout << suma[bit] << '\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 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 | // Marcin Knapik // Potyczki Algorytmiczne #pragma GCC optimize "O3" #include<bits/stdc++.h> using namespace std; #define vi vector<int> #define ll long long const int N = 1e7 + 700; int suf[N][2]; int pref[N][2]; int suff[N]; int preff[N]; ll suma[2]; int main(){ ios::sync_with_stdio(0); cin.tie(0); int n, m, mod; cin >> n >> m >> mod; bool bit = 0; suma[0] = 1; pref[m][0] = 1; suf[1][0] = 1; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ preff[j] = preff[j - 1] + pref[j][bit]; if(preff[j] >= mod) preff[j] -= mod; } for(int j = m; j >= 1; j--){ suff[j] = suff[j + 1] + suf[j][bit]; if(suff[j] >= mod) suff[j] -= mod; } suma[bit ^ 1] = 0; for(int j = 1; j <= m; j++){ pref[j][bit ^ 1] = (pref[j - 1][bit ^ 1] + suma[bit] - suff[j + 1] - preff[j - 1] + 1ll * (j - 1) * suf[j][bit] + mod + mod) % mod; suma[bit ^ 1] += pref[j][bit ^ 1]; } for(int j = m; j >= 1; j--) suf[j][bit ^ 1] = (suf[j + 1][bit ^ 1] + suma[bit] - suff[j + 1] - preff[j - 1] + 1ll * (m - j) * pref[j][bit] + mod + mod) % mod; bit ^= 1; suma[bit] %= mod; } cout << suma[bit] << '\n'; } |
English