#pragma GCC optimize("Ofast,fast-math,unroll-loops")
 
#include <bits/stdc++.h>
 
#define int ll
//#define double long double
#define endl '\n'
#define all(C) (C).begin(), (C).end()
#define rall(C) (C).rbegin(), (C).rend()
#define mp make_pair 
#define pb emplace_back
#define dbg(x) cerr << #x << " : " << x << endl
//#define PI 3.141592653589
 
using namespace std;
        
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair <int, int>;
using pld = pair <ld, ld>;

/*
const ll MAX_MEM = 4e8;
char MEM[MAX_MEM];
ll MEM_POS = 0;
void* operator new(size_t x)
{
    auto ret = MEM + MEM_POS;
    MEM_POS += x;
    assert(MEM_POS < MAX_MEM);
    return ret;
}
void operator delete(void*)
{}
*/
        
template <class T>
istream& operator>> (istream &in, vector <T> &a)
{
    for (auto &i : a)
        in >> i;
    return in;
}
        
template <class T> 
ostream& operator<< (ostream &out, vector <T> a)
{
    for (auto &i : a)
        out << i << ' ';
    return out;
}
        
template <class T, class U>
istream& operator>> (istream &in, pair <T, U> &p)
{
    in >> p.first >> p.second;
    return in;
}
        
template <class T, class U>
ostream& operator<< (ostream &out, pair <T, U> p)
{
    out << p.first << " " << p.second << " ";
    return out;
}
        
inline void Start()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    //freopen("lol.in", "r", stdin);
    //freopen("lol.out", "w", stdout);
}

const int P = 924844033;
int add(int a, int b)
{
    return a + b >= P ? (a + b) % P : a + b;
}
int mul(int a, int b)
{
    return (a * b) % P;
}

signed main()
{
    Start();
    int n, k;
    cin >> n >> k;
    vector <int> a(n + 1);
    a[0] = 1;
    vector <int> used(n);
    for (int i = 0; i < n; ++i)
    {
        if (used[i])
            continue;
        used[i] = 1;
        vector <vector <int>> dp(n + 1, vector <int> (2)), ndp(n + 1, vector <int> (2));
        int mxlen = 0;
        dp[0][0] = 1;
        if (i - k >= 0)
            dp[1][0] = 1, mxlen = 1;
        if (i + k < n)
            dp[1][1] = 1, mxlen = 1;
        for (int j = i + 2 * k; j < n; j += 2 * k)
        {
            used[j] = 1;
            ++mxlen;
            for (int l = 0; l <= mxlen; ++l)
            {
                ndp[l][0] = add(dp[l][0], dp[l][1]);
                if (l)
                    ndp[l][0] = add(ndp[l][0], dp[l - 1][0]);
                if (l && j + k < n)
                    ndp[l][1] = add(dp[l - 1][0], dp[l - 1][1]);
            }
            swap(ndp, dp);
            for (int l = 0; l <= mxlen; ++l)
            {
                ndp[l][0] = ndp[l][1] = 0;
            }
        }
        vector <int> na(n + 1);
        for (int x = 0; x <= n; ++x)
            for (int y = 0; y <= mxlen; ++y)
                if (x + y <= n)
                    na[x + y] = add(na[x + y], mul(a[x], add(dp[y][0], dp[y][1])));
        a = na;
    }
    vector <int> fact(n + 1, 1);
    for (int i = 1; i <= n; ++i)
        fact[i] = mul(fact[i - 1], i);
    int ans = 0;
    for (int i = 0; i <= n; ++i)
        ans = add(ans, P + (i % 2 == 0 ? 1 : -1) * mul(a[i], fact[n - i]));
    cout << ans;
    return 0;
}



Measured memory_bytes: 512