#include<bits/stdc++.h>
using namespace std;
#define REP(i, n) for(int i = 0; i < n; i++)
#define FOR(i, a, b) for(int i = a; i <= b; i++)
#define ST first
#define ND second
ostream& operator<<(ostream &out, string str) {
for(char c : str) out << c;
return out;
}
template<class L, class R> ostream& operator<<(ostream &out, pair<L, R> p) {
return out << "(" << p.ST << ", " << p.ND << ")";
}
template<class T> auto operator<<(ostream &out, T &&x) -> decltype(x.begin(), out) {
out << '{';
for(auto &e : x)
out << e << (&e == &*--x.end() ? "" : ", ");
return out << '}';
}
template<class... Args> void dump(Args&&... args) {
((cerr << args << "; "), ...);
}
#ifdef DEBUG
# define debug(x...) cerr << "[" #x "]: ", dump(x), cerr << "\n"
#else
# define debug(...) false
#endif
template<class T> int size(T && a) { return (int) a.size(); }
using LL = long long;
using PII = pair<int, int>;
int mod;
struct modular {
int val;
modular() { val = 0; }
modular(const LL& v) {
val = (-mod <= v && v <= mod) ? v : v % mod;
if(val < 0) val += mod;
}
int to_int() { return val; }
friend ostream& operator<<(ostream &os, const modular &a) {
return os << a.val;
}
friend istream& operator>>(istream &is, modular &a) {
return is >> a.val;
}
friend bool operator==(const modular &a, const modular &b) {
return a.val == b.val;
}
friend bool operator!=(const modular &a, const modular &b) {
return !(a == b);
}
friend bool operator<(const modular &a, const modular &b) {
return a.val < b.val;
}
friend bool operator<=(const modular &a, const modular &b) {
return a.val <= b.val;
}
modular operator-() const { return modular(-val); }
modular& operator+=(const modular &m) {
if((val += m.val) >= mod) val -= mod;
return *this;
}
modular& operator-=(const modular &m) {
if((val -= m.val) < 0) val += mod;
return *this;
}
modular& operator*=(const modular &m) {
val = (LL) val * m.val % mod;
return *this;
}
friend modular qpow(modular a, LL n) {
if(n == 0) return 1;
if(n % 2 == 1) return qpow(a, n - 1) * a;
return qpow(a * a, n / 2);
}
friend modular inv(const modular &a) {
assert(a != 0); return qpow(a, mod - 2);
}
modular& operator /=(const modular &m) {
return (*this) *= inv(m);
}
friend modular operator+(modular a, const modular &b) { return a += b; }
friend modular operator-(modular a, const modular &b) { return a -= b; }
friend modular operator*(modular a, const modular &b) { return a *= b; }
friend modular operator/(modular a, const modular &b) { return a /= b; }
};
using mint = modular;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m >> mod;
vector<mint> dp(m);
REP(i, m)
dp[i] = LL(i + 1) * (i + 2) / 2;
FOR(k, 1, n - 1) {
mint sum = 0;
vector<mint> nt(m);
REP(i, m) {
if(i) nt[i] = nt[i - 1];
nt[i] += dp.back() * (i + 1);
nt[i] -= sum;
sum += dp[i];
if(i != m - 1)
nt[i] -= dp[m - i - 2] * (i + 1);
}
swap(dp, nt);
}
cout << dp.back() << "\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 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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include<bits/stdc++.h> using namespace std; #define REP(i, n) for(int i = 0; i < n; i++) #define FOR(i, a, b) for(int i = a; i <= b; i++) #define ST first #define ND second ostream& operator<<(ostream &out, string str) { for(char c : str) out << c; return out; } template<class L, class R> ostream& operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.ST << ", " << p.ND << ")"; } template<class T> auto operator<<(ostream &out, T &&x) -> decltype(x.begin(), out) { out << '{'; for(auto &e : x) out << e << (&e == &*--x.end() ? "" : ", "); return out << '}'; } template<class... Args> void dump(Args&&... args) { ((cerr << args << "; "), ...); } #ifdef DEBUG # define debug(x...) cerr << "[" #x "]: ", dump(x), cerr << "\n" #else # define debug(...) false #endif template<class T> int size(T && a) { return (int) a.size(); } using LL = long long; using PII = pair<int, int>; int mod; struct modular { int val; modular() { val = 0; } modular(const LL& v) { val = (-mod <= v && v <= mod) ? v : v % mod; if(val < 0) val += mod; } int to_int() { return val; } friend ostream& operator<<(ostream &os, const modular &a) { return os << a.val; } friend istream& operator>>(istream &is, modular &a) { return is >> a.val; } friend bool operator==(const modular &a, const modular &b) { return a.val == b.val; } friend bool operator!=(const modular &a, const modular &b) { return !(a == b); } friend bool operator<(const modular &a, const modular &b) { return a.val < b.val; } friend bool operator<=(const modular &a, const modular &b) { return a.val <= b.val; } modular operator-() const { return modular(-val); } modular& operator+=(const modular &m) { if((val += m.val) >= mod) val -= mod; return *this; } modular& operator-=(const modular &m) { if((val -= m.val) < 0) val += mod; return *this; } modular& operator*=(const modular &m) { val = (LL) val * m.val % mod; return *this; } friend modular qpow(modular a, LL n) { if(n == 0) return 1; if(n % 2 == 1) return qpow(a, n - 1) * a; return qpow(a * a, n / 2); } friend modular inv(const modular &a) { assert(a != 0); return qpow(a, mod - 2); } modular& operator /=(const modular &m) { return (*this) *= inv(m); } friend modular operator+(modular a, const modular &b) { return a += b; } friend modular operator-(modular a, const modular &b) { return a -= b; } friend modular operator*(modular a, const modular &b) { return a *= b; } friend modular operator/(modular a, const modular &b) { return a /= b; } }; using mint = modular; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m >> mod; vector<mint> dp(m); REP(i, m) dp[i] = LL(i + 1) * (i + 2) / 2; FOR(k, 1, n - 1) { mint sum = 0; vector<mint> nt(m); REP(i, m) { if(i) nt[i] = nt[i - 1]; nt[i] += dp.back() * (i + 1); nt[i] -= sum; sum += dp[i]; if(i != m - 1) nt[i] -= dp[m - i - 2] * (i + 1); } swap(dp, nt); } cout << dp.back() << "\n"; } |
English