#include <iostream>
#include <vector>
using namespace std;
struct cell {
int64_t p;
int64_t z;
};
int main(int argc, char* argv[]) {
ios_base::sync_with_stdio (false);
int64_t n, m, p, i, j, w, d;
cin >> n >> m >> p;
vector<cell> c[2]={vector<cell>(m), vector<cell>(m)};
vector<int64_t> b(m);
int s, ns, tmp;
s = 0;
ns = 1;
for(j = 0; j < m; ++j) {
c[s][j].p = 1;
}
c[s][0].z = 1;
for (i = 0; i < n; ++i) {
d = 0;
for (j = 0; j < m; ++j) {
d = (d + c[s][j].p + j * c[s][j].z) % p;
c[ns][j].p = ((m - j) * d) % p;
c[ns][j].z = ((m - j) * c[s][j].p) % p;
if (j > 0) {
b[j - 1] = (((m - j) * c[s][j].z) % p);
}
}
d = 0;
for (j = m - 2; j >= 0 ; --j) {
d = (d + b[j]) % p;
c[ns][j].p = (c[ns][j].p + ((d * (j + 1)) % p)) % p;
c[ns][j].z = (c[ns][j].z + d) % p;
}
tmp = s;
s = ns;
ns = tmp;
}
int64_t sum = 0;
for (j = 0; j < m; ++j) {
sum = (sum + c[s][j].z) % p;
}
cout << sum << "\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 | #include <iostream> #include <vector> using namespace std; struct cell { int64_t p; int64_t z; }; int main(int argc, char* argv[]) { ios_base::sync_with_stdio (false); int64_t n, m, p, i, j, w, d; cin >> n >> m >> p; vector<cell> c[2]={vector<cell>(m), vector<cell>(m)}; vector<int64_t> b(m); int s, ns, tmp; s = 0; ns = 1; for(j = 0; j < m; ++j) { c[s][j].p = 1; } c[s][0].z = 1; for (i = 0; i < n; ++i) { d = 0; for (j = 0; j < m; ++j) { d = (d + c[s][j].p + j * c[s][j].z) % p; c[ns][j].p = ((m - j) * d) % p; c[ns][j].z = ((m - j) * c[s][j].p) % p; if (j > 0) { b[j - 1] = (((m - j) * c[s][j].z) % p); } } d = 0; for (j = m - 2; j >= 0 ; --j) { d = (d + b[j]) % p; c[ns][j].p = (c[ns][j].p + ((d * (j + 1)) % p)) % p; c[ns][j].z = (c[ns][j].z + d) % p; } tmp = s; s = ns; ns = tmp; } int64_t sum = 0; for (j = 0; j < m; ++j) { sum = (sum + c[s][j].z) % p; } cout << sum << "\n"; } |
English