#include <iostream>
#include <vector>
#include <cstring>
using namespace std;


#define REP(i, s) for (int i = 0; i < s; ++i)
#define ALL(v) (v.begin(), v.end())
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }


const int MOD = 924844033;
const int MAX = 5100;
typedef long long ll;


ll modpow(ll a, ll n = MOD-2) {
    ll r=1;
    while(n) r=r*((n%2)?a:1)%MOD,a=a*a%MOD,n>>=1;
    return r;
}

vector<ll> ntt(vector<ll> v, bool rev=false) {
    int n=v.size(),i,j,m;
    
    for(i=0,j=1;j<n-1;j++) {
        for(int k=n>>1;k>(i^=k);k>>=1);
        if(i>j) swap(v[i],v[j]);
    }
    for(int m=2; m<=n; m*=2) {
        ll wn=modpow(5,(MOD-1)/m);
        if(rev) wn=modpow(wn);
        for(i=0;i<n;i+=m) {
            ll w=1;
            for(int j1=i,j2=i+m/2;j2<i+m;j1++,j2++) {
                ll t1=v[j1],t2=w*v[j2]%MOD;
                v[j1]=t1+t2;
                v[j2]=t1+MOD-t2;
                while(v[j1]>=MOD) v[j1]-=MOD;
                while(v[j2]>=MOD) v[j2]-=MOD;
                w=w*wn%MOD;
            }
        }
    }
    if(rev) {
        ll rv = modpow(n);
        for (int i = 0; i < n; ++i) v[i]=v[i]*rv%MOD;
    }
    return v;
}





long long fac[MAX],finv[MAX],inv[MAX];
void COMinit(){
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for(int i = 2; i < MAX; i++){
        fac[i] = fac[i-1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD/i) % MOD;
        finv[i] = finv[i-1] * inv[i] % MOD;
    }
}

int dp[4100][2100][2];

void add(int &a, int b) {
    a += b;
    if (a >= MOD) a -= MOD;
}


const int BEKIMAX = 1<<11;

int main() {
    COMinit();
    int N, K;
    cin >> N >> K;
    
    memset(dp, 0, sizeof(dp));
    dp[0][0][0] = 1;
    for (int i = 0; i <= N*2; ++i) {
        for (int j = 0; j <= min(N, i); ++j) {
            if (dp[i][j] == 0) continue;
            
            //cout << i << ", " << j << ": " << dp[i][j][0] << ", " << dp[i][j][1] << endl;
            
            add(dp[i+1][j][0], dp[i][j][0]);
            add(dp[i+1][j][0], dp[i][j][1]);
            add(dp[i+1][j+1][1], dp[i][j][0]);
        }
    }
    
    vector<vector<ll> > coefs(K*2, vector<ll>(BEKIMAX, 0));
    for (int k = 0; k < K*2; ++k) {
        int path = 0;
        for (int i = k; i < N; i += K*2) {
            if (i - K >= 0) ++path;
            if (i + K < N) ++path;
        }
        for (int i = 0; i <= N; ++i) {
            coefs[k][i] = (dp[path][i][0] + dp[path][i][1]) % MOD;
        }
    }

    //COUT(coefs);
    
    for (int k = 0; k < K*2; ++k) {
        coefs[k] = ntt(coefs[k]);
    }
    
    //COUT(coefs);
    
    vector<ll> houjo(BEKIMAX, 1);
    for (int i = 0; i < BEKIMAX; ++i) {
        for (int k = 0; k < K*2; ++k) {
            (houjo[i] *= coefs[k][i]) %= MOD;
        }
    }
    //COUT(houjo);
    
    houjo = ntt(houjo, true);
    
    //COUT(houjo);
    
    long long res = 0;
    for (int num = 0; num <= N; ++num) {
        if (num % 2 == 0) (res += fac[N - num] * houjo[num] % MOD) %= MOD;
        else (res += MOD - fac[N - num] * houjo[num] % MOD) %= MOD;
    }
    
    cout << res << endl;
}

Measured memory_bytes: 131840