#include <bits/stdc++.h> using namespace std; #define fastIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) using ll = long long; using vll = vector<ll>; int n, m; ll p; #define ra(x) ((x) >= p ? (x)-p : x) #define rs(x) ((x) < 0 ? (x)+p : x) #define rm(x) ((x) % p) int main() { fastIO; cin >> n >> m >> p; if (m == 1) { cout << 1; return 0; } vll old(m), oldPref(m), oldPrefPref(m); vll nww(m), nwwPref(m), nwwPrefPref(m); nww[0] = nwwPref[0] = nwwPrefPref[0] = 1; for (int i = 1; i < m; ++i) { nww[i] = i + 1; nwwPref[i] = ra(nwwPref[i-1] + i + 1); nwwPrefPref[i] = ra(nwwPrefPref[i-1] + nwwPref[i]); } //cout << nww << nwwPref << nwwPrefPref << '\n'; while(--n) { swap(nww, old); swap(nwwPref, oldPref); swap(nwwPrefPref, oldPrefPref); nww[0] = old[m-1]; for (int i = 1; i < m - 1; ++i) nww[i] = rs(rm((i+1)*rs(oldPref[m-1]-oldPref[m-2-i])) - oldPrefPref[i-1]); nww[m-1] = rs(rm(m*(oldPref[m-1])) - oldPrefPref[m-2]); nwwPref[0] = nwwPrefPref[0] = nww[0]; for (int i = 1; i < m; ++i) { nwwPref[i] = ra(nwwPref[i-1] + nww[i]); nwwPrefPref[i] = ra(nwwPrefPref[i-1] + nwwPref[i]); } //cout << nww << nwwPref << nwwPrefPref << '\n'; } cout << nwwPref.back(); 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 | #include <bits/stdc++.h> using namespace std; #define fastIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) using ll = long long; using vll = vector<ll>; int n, m; ll p; #define ra(x) ((x) >= p ? (x)-p : x) #define rs(x) ((x) < 0 ? (x)+p : x) #define rm(x) ((x) % p) int main() { fastIO; cin >> n >> m >> p; if (m == 1) { cout << 1; return 0; } vll old(m), oldPref(m), oldPrefPref(m); vll nww(m), nwwPref(m), nwwPrefPref(m); nww[0] = nwwPref[0] = nwwPrefPref[0] = 1; for (int i = 1; i < m; ++i) { nww[i] = i + 1; nwwPref[i] = ra(nwwPref[i-1] + i + 1); nwwPrefPref[i] = ra(nwwPrefPref[i-1] + nwwPref[i]); } //cout << nww << nwwPref << nwwPrefPref << '\n'; while(--n) { swap(nww, old); swap(nwwPref, oldPref); swap(nwwPrefPref, oldPrefPref); nww[0] = old[m-1]; for (int i = 1; i < m - 1; ++i) nww[i] = rs(rm((i+1)*rs(oldPref[m-1]-oldPref[m-2-i])) - oldPrefPref[i-1]); nww[m-1] = rs(rm(m*(oldPref[m-1])) - oldPrefPref[m-2]); nwwPref[0] = nwwPrefPref[0] = nww[0]; for (int i = 1; i < m; ++i) { nwwPref[i] = ra(nwwPref[i-1] + nww[i]); nwwPrefPref[i] = ra(nwwPrefPref[i-1] + nwwPref[i]); } //cout << nww << nwwPref << nwwPrefPref << '\n'; } cout << nwwPref.back(); return 0; } |