#include <bits/stdc++.h>
using namespace std;

const int maxn = 262144, P = 924844033;
int n, m, fact[maxn], finv[maxn], pw[maxn];
int lim, l, r[maxn], w[maxn];

int qp(int x, int y) {
    int z = 1;
    for (; y; y >>= 1, x = 1LL * x * x % P) {
        if (y & 1) z = 1LL * z * x % P;
    }
    return z;
}

void DFT(vector<int> &a, int tp) {
    static unsigned long long c[maxn];
    copy(a.begin(), a.begin() + lim, c), w[lim >> 1] = 1;
    for (int i = 0; i < lim; i++) if (i < r[i]) swap(c[i], c[r[i]]);
    int t = qp(5, (P - 1) / lim);
    for (int i = (lim >> 1) + 1; i < lim; i++) w[i] = 1LL * w[i - 1] * t % P;
    for (int i = (lim >> 1) - 1; i > 0; i--) w[i] = w[i << 1];
    for (int i = 1; i < lim; i <<= 1) {
        for (int j = 0; j < lim; j += (i << 1)) {
            for (int k = 0; k < i; k++) {
                unsigned long long t = c[i + j + k] * w[i + k] % P;
                c[i + j + k] = c[j + k] + P - t, c[j + k] += t;
            }
        }
    }
    if (tp == -1) {
        reverse(c + 1, c + lim);
        for (int i = 0, t = qp(lim, P - 2); i < lim; i++) c[i] = c[i] % P * t % P;
    }
    for (int i = 0; i < lim; i++) a[i] = c[i] % P;
}

void fix(vector<int> &V, int n) {
    while (V.size() > n) V.pop_back();
    while (V.size() < n) V.push_back(0);
}

vector<int> mul(vector<int> A, vector<int> B) {
    int len = A.size() + B.size() - 1;
    for (lim = 1, l = 0; lim < A.size() + B.size(); lim <<= 1) l++;
    for (int i = 0; i < lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
    fix(A, lim), fix(B, lim), DFT(A, 1), DFT(B, 1);
    for (int i = 0; i < lim; i++) A[i] = 1LL * A[i] * B[i] % P;
    DFT(A, -1), fix(A, len); return A;
}

int main() {
    scanf("%d %d", &n, &m);
    for (int i = fact[0] = finv[0] = pw[0] = 1; i <= n; i++) {
        fact[i] = 1LL * i * fact[i - 1] % P;
        finv[i] = qp(fact[i], P - 2);
        pw[i] = (pw[i - 1] + pw[i - 1]) % P;
    }
    auto C = [&](int x, int y) {
        if (x < y) return 0LL;
        return 1LL * fact[x] * finv[y] % P * finv[x - y] % P;
    };
    auto solve = [&](int x) {
        vector<int> poly(x + 1);
        for (int i = 0; i + i <= x; i++) {
            poly[i] = C(x - i, i);
        }
        poly = mul(poly, poly);
        fix(poly, x + 1); return poly;
    };
    priority_queue<pair<int, vector<int>>> Q;
    for (int i = 1; i <= m; i++) {
        int j = 0, k = i;
        while (k <= n) j++, k += m;
        auto t = solve(j);
        Q.push(make_pair(-t.size(), t));
    }
    while (Q.size() > 1) {
        auto p = Q.top(); Q.pop();
        auto q = Q.top(); Q.pop();
        auto t = mul(p.second, q.second);
        Q.push(make_pair(-t.size(), t));
    }
    auto ans = Q.top().second;
    for (int i = 0; i <= n; i++) {
        ans[i] = 1LL * ans[i] * fact[n - i] % P;
    }
    reverse(ans.begin(), ans.end());
    vector<int> A(n + 1), B(n + 1);
    for (int i = 0; i <= n; i++) {
        A[i] = 1LL * ans[i] * fact[n - i] % P;
        if (i) B[i] = 1LL * (i & 1 ? P - 1 : 1) * finv[i] % P;
    }
    A = mul(A, B);
    for (int i = 0; i <= n; i++) {
        ans[i] = (ans[i] + 1LL * finv[n - i] * A[i]) % P;
    }
    reverse(ans.begin(), ans.end());
    for (int i = 0; i <= 0; i++) {
        printf("%d\n", ans[i]);
    }
    return 0;
}

Measured memory_bytes: 4068