#include using namespace std; #include using namespace atcoder; using mint = modint998244353; int main() { int N, M; cin >> N >> M; vector> dp(N + 1, vector(M + 1, 0)); // 二次元累積和 for (int i = 0; i <= N; i++) { dp.at(i).at(1) = 1; } for (int j = 1; j <= M; j++) { dp.at(0).at(j) = 1; } for (int i = 1; i <= N; i++) { for (int j = 2; j <= M; j++) { dp.at(i).at(j) += dp.at(i).at(j - 1); dp.at(i).at(j) += dp.at(i - 1).at(M); if (i - j >= 0) { dp.at(i).at(j) -= dp.at(i - j).at(j - 1); dp.at(i).at(j) += dp.at(i - j).at(j); dp.at(i).at(j) -= dp.at(i - j).at(M); } } } mint ans = mint(M).pow(N) - (dp.at(N).at(M) - dp.at(N - 1).at(M)); cout << ans.val() << endl; }