#include <bits/stdc++.h>
#pragma optimize("TKACHENKO-GORYACHENKO")
#pragma GCC optimize("O3")
using namespace std;
const long long maxn = 7e3;
const long long mod = 924844033;
long long n, k;
long long ANS[maxn];
long long F[maxn];
long long RF[maxn];
long long step(long long a, long long x) {
  if (x == 0) {
    return 1;
  }
  if (x % 2 == 1) {
    return a * (step(a, x - 1)) % mod;
    ;
  }
  long long t = step(a, x / 2);
  return t * t % mod;
}
long long del(long long a, long long b) { return a * step(b, mod - 2) % mod; }
long long getc(long long n, long long k) {
  return F[n] * RF[k] % mod * RF[n - k] % mod;
}
int main() {
  long long q, w, e, a, b;
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  F[0] = 1;
  RF[0] = del(1, F[0]);
  for (q = 1; q < maxn; q++) {
    F[q] = F[q - 1] * q;
    F[q] %= mod;
    RF[q] = del(1, F[q]);
  }
  cin >> n >> k;
  if (2 * k >= n) {
    long long c = min(2 * n - 2 * k, n);
    long long ans = F[n];
    for (q = 1; q <= c; q++) {
      if (q % 2 == 1) {
        ans -= F[n - q] * getc(c, q);
        ans += mod * mod;
        ans %= mod;
      } else {
        ans += F[n - q] * getc(c, q);
        ans %= mod;
      }
    }
    cout << ans;
  } else {
    ANS[0] = 1;
    for (q = 0; q < k; q++) {
      long long c = 0;
      for (w = q; w < n; w += k) {
        c++;
      }
      vector<vector<long long> > D1;
      D1.resize(c + 10);
      for (w = 0; w < c; w++) {
        D1[w].resize(n + 10);
      }
      D1[1][1] = 1;
      for (w = 2; w < c; w++) {
        for (e = 1; e <= c; e++) {
          if (e == 1) {
            D1[w][e] = D1[w - 1][e] + 1;
            continue;
          }
          if (w - 2 >= 0 && e >= 1) {
            D1[w][e] = D1[w - 1][e] + D1[w - 2][e - 1];
            D1[w][e] %= mod;
          } else {
            D1[w][e] = D1[w - 1][e];
          }
        }
      }
      long long ANS1[maxn];
      for (w = 0; w < 2 * n; w++) {
        ANS1[w] = ANS[w];
      }
      for (w = 0; w <= c; w++) {
        for (e = 2 * n - 1; e >= 0; e--) {
          if (e - w >= 0) {
            ANS1[e] = D1[c - 1][w] * ANS[e - w] + ANS1[e];
            ANS1[e] %= mod;
          }
        }
      }
      for (w = 0; w < 2 * n; w++) {
        ANS[w] = ANS1[w];
      }
      for (w = 0; w <= c; w++) {
        for (e = 2 * n - 1; e >= 0; e--) {
          if (e - w >= 0) {
            ANS1[e] = D1[c - 1][w] * ANS[e - w] + ANS1[e];
            ANS1[e] %= mod;
          }
        }
      }
      for (w = 0; w < 2 * n; w++) {
        ANS[w] = ANS1[w];
      }
    }
    long long ans = F[n];
    for (q = 1; q <= 2 * n; q++) {
      if (q % 2 == 1) {
        ans -= (F[n - q] * ANS[q] % mod);
        ans += mod;
        ans %= mod;
      } else {
        ans += F[n - q] * ANS[q];
        ans %= mod;
      }
    }
    cout << ans;
  }
  return 0;
}
