#include using namespace std; #include using namespace atcoder; using mint = modint998244353; #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") int main() { int N, M; cin >> N >> M; vector dp(2, vector(M + 1, vector(N + 1, mint(0)))); dp[0][0][0] = 1; for (int i = 0; i < N; i++) { int pi = i & 1, ni = 1 - pi; for (int j = 0; j <= M; j++) { dp[ni][j].assign(N + 1, 0); } mint s = 0; for (int j = 0; j <= M; j++) { for (int k = 0; k <= N; k++) { if (k + 1 <= N && k + 1 < j) dp[ni][j][k + 1] += dp[pi][j][k]; s += dp[pi][j][k]; if (1 < j) dp[ni][j][1] -= dp[pi][j][k]; } } for (int j = 2; j <= M; j++) { dp[ni][j][1] += s; } } mint ans = mint(M).pow(N); for (int j = 0; j <= M; j++) { for (int k = 0; k <= N; k++) { mint tmp = dp[N & 1][j][k]; ans -= tmp; } } cout << ans.val() << endl; }