#include #include #include using namespace std; using Mint = atcoder::modint998244353; int main() { int N, M; cin >> N >> M; if (M == 1) { cout << 1 << endl; return 0; } vector C(N + 1, 0); for (int i = 2; i <= M; ++i) { for (int base = 1; base <= N; base += i) { if (base <= N) C[base]++; if (base + i - 1 <= N) C[base + i - 1]--; } } C.erase(C.begin()); vector D(N + 1, 0); D[0] = 1; function DnC = [&](int L, int R) { if (L == R) return; int M = (L + R) / 2; DnC(L, M); vector V(D.begin() + L, D.begin() + M + 1); vector Co(C.begin(), C.begin() + (R - L)); vector ans = atcoder::convolution(V, Co); for (int i = M + 1; i <= R; ++i) D[i] += ans[i - (M + 1) + (int)V.size() - 1]; DnC(M + 1, R); }; DnC(0, N); cout << (Mint(M).pow(N) - D.back()).val() << endl; }