// Artur Kraska, II UWr #include <bits/stdc++.h> #define forr(i, n) for(int i=0; i<n; i++) #define FOREACH(iter, coll) for(auto iter = coll.begin(); iter != coll.end(); ++iter) #define FOREACHR(iter, coll) for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter) #define lbound(P,R,PRED) ({typeof(P) X=P,RRR=(R), PPP = P; while(PPP<RRR) {X = (PPP+(RRR-PPP)/2); if(PRED) RRR = X; else PPP = X+1;} PPP;}) #define testy() int _tests; scanf("%d", &_tests); FOR(_test, 1, _tests) #define CLEAR(tab) memset(tab, 0, sizeof(tab)) #define CONTAIN(el, coll) (coll.find(el) != coll.end()) #define FOR(i, a, b) for(int i=a; i<=b; i++) #define FORD(i, a, b) for(int i=a; i>=b; i--) #define MP make_pair #define PB push_back #define ff first #define ss second #define deb(X) ; #define M 1000000007 #define INF 1000000007LL using namespace std; int n, m; long long p; long long pom[100][100][100]; long long r[2][10000007]; long long brut() { FOR(i, 1, m) FOR(j, i, m) pom[1][i][j] = 1; FOR(l, 2, n) FOR(i, 1, m) FOR(j, i, m) FOR(i2, 1, m) FOR(j2, i2, m) pom[l][i][j] += (j >= i2 && j2 >= i? 1 : 0)*pom[l-1][i2][j2]; long long res = 0; FOR(l, 1, n) { deb(cout << "level " << l << endl); FOR(i, 1, m) { long long rr = 0; FOR(j, i, m) { /* FOR(k, 1, i-1) cout << "."; FOR(k, i, j) cout << "X"; FOR(k, j+1, m) cout << "."; cout << " daje wynik " << pom[l][i][j] << endl; */ if(l == n) res += pom[l][i][j]; rr += pom[l][i][j]; } deb(cout << " r[" << m-i+1 << "] = " << rr << endl); } } return res; } long long brut2() { FOR(i, 1, m) r[1][i] = (i*((long long)i+1)/2)%p; int curr = 1; int opp = 0; FOR(ll, 2, n) { swap(curr, opp); long long s = 0; FOR(i, 1, m) { r[curr][i] = (r[curr][i-1] + i*(r[opp][m] + p - r[opp][m-i]) + p - s)%p; s = (s + r[opp][i])%p; } } return r[curr][m]; } int main() { scanf("%d %d %lld", &n, &m, &p); //printf("%lld\n", brut()); printf("%lld\n", brut2()); 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 97 98 99 | // Artur Kraska, II UWr #include <bits/stdc++.h> #define forr(i, n) for(int i=0; i<n; i++) #define FOREACH(iter, coll) for(auto iter = coll.begin(); iter != coll.end(); ++iter) #define FOREACHR(iter, coll) for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter) #define lbound(P,R,PRED) ({typeof(P) X=P,RRR=(R), PPP = P; while(PPP<RRR) {X = (PPP+(RRR-PPP)/2); if(PRED) RRR = X; else PPP = X+1;} PPP;}) #define testy() int _tests; scanf("%d", &_tests); FOR(_test, 1, _tests) #define CLEAR(tab) memset(tab, 0, sizeof(tab)) #define CONTAIN(el, coll) (coll.find(el) != coll.end()) #define FOR(i, a, b) for(int i=a; i<=b; i++) #define FORD(i, a, b) for(int i=a; i>=b; i--) #define MP make_pair #define PB push_back #define ff first #define ss second #define deb(X) ; #define M 1000000007 #define INF 1000000007LL using namespace std; int n, m; long long p; long long pom[100][100][100]; long long r[2][10000007]; long long brut() { FOR(i, 1, m) FOR(j, i, m) pom[1][i][j] = 1; FOR(l, 2, n) FOR(i, 1, m) FOR(j, i, m) FOR(i2, 1, m) FOR(j2, i2, m) pom[l][i][j] += (j >= i2 && j2 >= i? 1 : 0)*pom[l-1][i2][j2]; long long res = 0; FOR(l, 1, n) { deb(cout << "level " << l << endl); FOR(i, 1, m) { long long rr = 0; FOR(j, i, m) { /* FOR(k, 1, i-1) cout << "."; FOR(k, i, j) cout << "X"; FOR(k, j+1, m) cout << "."; cout << " daje wynik " << pom[l][i][j] << endl; */ if(l == n) res += pom[l][i][j]; rr += pom[l][i][j]; } deb(cout << " r[" << m-i+1 << "] = " << rr << endl); } } return res; } long long brut2() { FOR(i, 1, m) r[1][i] = (i*((long long)i+1)/2)%p; int curr = 1; int opp = 0; FOR(ll, 2, n) { swap(curr, opp); long long s = 0; FOR(i, 1, m) { r[curr][i] = (r[curr][i-1] + i*(r[opp][m] + p - r[opp][m-i]) + p - s)%p; s = (s + r[opp][i])%p; } } return r[curr][m]; } int main() { scanf("%d %d %lld", &n, &m, &p); //printf("%lld\n", brut()); printf("%lld\n", brut2()); return 0; } |