#pragma GCC optimize("O3") #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define BOOST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define FOR(a, b, c) for(int a = b; a < c; ++a) #define PB push_back #define MP make_pair #define INF (int)1e9+7 #define LLINF 2e18+7 #define ALL(a) a.begin(), a.end() #define SIZE(a) (int)a.size() typedef unsigned long long ULL; typedef long long LL; typedef long double LD; using namespace std; //#define DEBUG const int MAX = 1e7+7; LL prefixes[MAX]; LL suffixes[MAX]; LL newPrefixes[MAX]; LL newSuffixes[MAX]; int main() { #ifndef DEBUG BOOST; #endif int n, m; LL p; cin >> n >> m >> p; FOR(i, 1, m + 1) { prefixes[i] = m - i + 1; suffixes[i] = i; } FOR(i, 0, n - 1) { LL prefixprefsum = 0; LL suffixprefsum = 0; LL subtract = 0; FOR(j, 1, m + 1) { prefixprefsum = (prefixprefsum + prefixes[j]) % p; subtract = (subtract - suffixprefsum + p) % p; suffixprefsum = (suffixprefsum + suffixes[j]) % p; newSuffixes[j] = ((j * prefixprefsum) % p + subtract) % p; } LL prefixsuffsum = 0; LL suffixsuffsum = 0; subtract = 0; for(int j = m; j >= 1; --j) { suffixsuffsum = (suffixsuffsum + suffixes[j]) % p; subtract = (subtract - prefixsuffsum + p) % p; prefixsuffsum = (prefixsuffsum + prefixes[j]) % p; newPrefixes[j] = ((m + 1 - j) * suffixsuffsum % p + subtract) % p; } FOR(j, 1, m + 1) { prefixes[j] = newPrefixes[j]; suffixes[j] = newSuffixes[j]; newSuffixes[j] = 0; newPrefixes[j] = 0; } } LL res = 0; FOR(i, 1, m + 1) res = (res + prefixes[i]) % p; cout << res << "\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 84 85 86 87 88 89 90 91 | #pragma GCC optimize("O3") #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define BOOST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define FOR(a, b, c) for(int a = b; a < c; ++a) #define PB push_back #define MP make_pair #define INF (int)1e9+7 #define LLINF 2e18+7 #define ALL(a) a.begin(), a.end() #define SIZE(a) (int)a.size() typedef unsigned long long ULL; typedef long long LL; typedef long double LD; using namespace std; //#define DEBUG const int MAX = 1e7+7; LL prefixes[MAX]; LL suffixes[MAX]; LL newPrefixes[MAX]; LL newSuffixes[MAX]; int main() { #ifndef DEBUG BOOST; #endif int n, m; LL p; cin >> n >> m >> p; FOR(i, 1, m + 1) { prefixes[i] = m - i + 1; suffixes[i] = i; } FOR(i, 0, n - 1) { LL prefixprefsum = 0; LL suffixprefsum = 0; LL subtract = 0; FOR(j, 1, m + 1) { prefixprefsum = (prefixprefsum + prefixes[j]) % p; subtract = (subtract - suffixprefsum + p) % p; suffixprefsum = (suffixprefsum + suffixes[j]) % p; newSuffixes[j] = ((j * prefixprefsum) % p + subtract) % p; } LL prefixsuffsum = 0; LL suffixsuffsum = 0; subtract = 0; for(int j = m; j >= 1; --j) { suffixsuffsum = (suffixsuffsum + suffixes[j]) % p; subtract = (subtract - prefixsuffsum + p) % p; prefixsuffsum = (prefixsuffsum + prefixes[j]) % p; newPrefixes[j] = ((m + 1 - j) * suffixsuffsum % p + subtract) % p; } FOR(j, 1, m + 1) { prefixes[j] = newPrefixes[j]; suffixes[j] = newSuffixes[j]; newSuffixes[j] = 0; newPrefixes[j] = 0; } } LL res = 0; FOR(i, 1, m + 1) res = (res + prefixes[i]) % p; cout << res << "\n"; return 0; } |