#include <bits/stdc++.h>
using namespace std;
template <typename Type>
inline bool chkmin(Type &x, const Type &y) {
  return x > y ? (x = y, 1) : 0;
}
template <typename Type>
inline bool chkmax(Type &x, const Type &y) {
  return x < y ? (x = y, 1) : 0;
}
template <typename Type>
inline Type read(Type &f) {
  f = 0;
  int x = 1;
  char c = getchar();
  while (!isdigit(c)) x = (c == '-' ? -1 : 1), c = getchar();
  while (isdigit(c)) (f *= 10) += c & 15, c = getchar();
  return f = x * f;
}
const int N = 1000000 + 5;
const int KCZ = 924844033, g = 5;
int n, k, S, vis[N];
int x, l, r[N], lim(1);
long long Ans, fac[N], inv[N];
void add(long long &x, const long long &y) {
  x += y;
  if (x >= KCZ) x -= KCZ;
}
void sub(long long &x, const long long &y) {
  x -= y;
  if (x < 0) x += KCZ;
}
long long A[N], B[N];
long long mp(long long x, long long y = KCZ - 2) {
  long long res = 1;
  while (y) {
    if (y & 1) res = res * x % KCZ;
    x = x * x % KCZ;
    y >>= 1;
  }
  return res;
}
void DFT(long long *A, int type) {
  for (int i = (0), ___ = (lim - 1); i <= ___; ++i)
    if (i < r[i]) swap(A[i], A[r[i]]);
  for (int mid = 1; mid < lim; mid <<= 1) {
    long long Wn = mp(g, (KCZ - 1) / (mid * 2));
    for (int R = mid << 1, j = 0; j < lim; j += R) {
      long long w = 1;
      for (int k = 0; k < mid; k++, w = w * Wn % KCZ) {
        long long x = A[j + k], y = w * A[j + k + mid] % KCZ;
        A[j + k] = x + y, A[j + k + mid] = x - y + KCZ;
        A[j + k] %= KCZ, A[j + k + mid] %= KCZ;
      }
    }
  }
  if (type == -1) {
    reverse(A + 1, A + lim);
    long long ginv = mp(lim);
    for (int i = (0), ___ = (lim - 1); i <= ___; ++i) A[i] = A[i] * ginv % KCZ;
  }
}
int now, vA, vB, cA, cB;
void NTT() {
  while (lim <= n + n) lim <<= 1, l++;
  for (int i = (0), ___ = (lim - 1); i <= ___; ++i)
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  DFT(A, 1), DFT(B, 1);
  for (int i = (0), ___ = (lim - 1); i <= ___; ++i)
    A[i] = mp(A[i], cA) * mp(B[i], cB) % KCZ;
  DFT(A, -1);
}
long long C(int n, int m) {
  if (n < m) return 0;
  return fac[n] * inv[m] % KCZ * inv[n - m] % KCZ;
}
const int L = 1000000;
void init() {
  fac[0] = 1;
  for (int i = (1), ___ = (L); i <= ___; ++i) fac[i] = fac[i - 1] * i % KCZ;
  inv[0] = 1;
  inv[L] = mp(fac[L]);
  for (int i = (L - 1), ___ = (1); i >= ___; --i)
    inv[i] = inv[i + 1] * (i + 1) % KCZ;
}
int main() {
  read(n), read(k), init();
  for (int i = (1), ___ = (k); i <= ___; ++i) {
    if (vA == 0 || vA == (n - i) / k + 1)
      vA = (n - i) / k + 1, cA += 2;
    else
      vB = (n - i) / k + 1, cB += 2;
  }
  for (int i = (0), ___ = (vA); i <= ___; ++i) A[i] = C(vA - i, i);
  for (int i = (0), ___ = (vB); i <= ___; ++i) B[i] = C(vB - i, i);
  NTT();
  for (int i = (0), ___ = (n); i <= ___; ++i) {
    long long v = A[i] * fac[n - i] % KCZ;
    i & 1 ? sub(Ans, v) : add(Ans, v);
  }
  cout << Ans << endl;
  return 0;
}
