Problem p03989 (C++)

Buggy submission (status: Runtime Error):
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
#include <bits/stdc++.h>
#define owo(i, a, b) for (int i = (a); i < (b); ++i)
#define uwu(i, a, b) for (int i = (a)-1; i >= (b); --i)
#define senpai push_back
#define ttgl pair<int, int>
#define ayaya cout << "ayaya~" << endl
using namespace std;
/*#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
gpu_hash_table<int, int> mp;
#define ordered_set tree<ttgl, null_type,less<ttgl>,
rb_tree_tag,tree_order_statistics_node_update>
 */
using ll = long long;
using ld = long double;
const ll MOD = 924844033;
const ll root = 62;
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
ll binpow(ll a, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = (res * a) % MOD;
    a = (a * a) % MOD;
    b >>= 1;
  }
  return res;
}
ll modInv(ll a) { return binpow(a, MOD - 2); }
const double PI = acos(-1);
const double eps = -1e6;
const int INF = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const ll NINFLL = 0xc0c0c0c0c0c0c0c0;
const int mxN = 2001;
ll dp[mxN][mxN][2];
bool flag[2 * mxN];
ll fact[mxN];
int n, k;
int main() {
  // freopen("file.in", "r", stdin);
  // freopen("file.out", "w", stdout);
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> k;
  int tot = 0;
  fact[0] = 1;
  owo(i, 1, n + 1) { fact[i] = (fact[i - 1] * i) % MOD; }
  owo(i, 1, k + 1) {
    int nxt = (n - i) / k + 1;
    flag[tot + 1] = true;
    tot += nxt;
    flag[tot + 1] = true;
    tot += nxt;
  }
  dp[0][0][0] = 1;
  owo(i, 1, tot + 1) {
    owo(j, 0, n + 1) {
      dp[i][j][0] = (dp[i - 1][j][0] + dp[i - 1][j][1]) % MOD;
      if (!flag[i] && j < n)
        dp[i][j + 1][1] = dp[i - 1][j][0];
    }
  }
  ll res = 0;
  owo(i, 0, n + 1) {
    ll incl = ((dp[tot][i][0] + dp[tot][i][1]) * fact[n - i]) % MOD;
    if (i & 1) {
      res = (res + MOD - incl) % MOD;
    } else {
      res = (res + incl) % MOD;
    }
  }
  cout << res << "\n";
  return 0;
}

Fixed submission:
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
#include <bits/stdc++.h>
#define owo(i, a, b) for (int i = (a); i < (b); ++i)
#define uwu(i, a, b) for (int i = (a)-1; i >= (b); --i)
#define senpai push_back
#define ttgl pair<int, int>
#define ayaya cout << "ayaya~" << endl
using namespace std;
/*#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
gpu_hash_table<int, int> mp;
#define ordered_set tree<ttgl, null_type,less<ttgl>,
rb_tree_tag,tree_order_statistics_node_update>
 */
using ll = long long;
using ld = long double;
const ll MOD = 924844033;
const ll root = 62;
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
ll binpow(ll a, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = (res * a) % MOD;
    a = (a * a) % MOD;
    b >>= 1;
  }
  return res;
}
ll modInv(ll a) { return binpow(a, MOD - 2); }
const double PI = acos(-1);
const double eps = -1e6;
const int INF = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const ll NINFLL = 0xc0c0c0c0c0c0c0c0;
const int mxN = 2001;
ll dp[2 * mxN][mxN][2];
bool flag[2 * mxN];
ll fact[mxN];
int n, k;
int main() {
  // freopen("file.in", "r", stdin);
  // freopen("file.out", "w", stdout);
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  cin.tie(0)->sync_with_stdio(0);
  cin >> n >> k;
  int tot = 0;
  fact[0] = 1;
  owo(i, 1, n + 1) { fact[i] = (fact[i - 1] * i) % MOD; }
  owo(i, 1, k + 1) {
    int nxt = (n - i) / k + 1;
    flag[tot + 1] = true;
    tot += nxt;
    flag[tot + 1] = true;
    tot += nxt;
  }
  dp[0][0][0] = 1;
  owo(i, 1, tot + 1) {
    owo(j, 0, n + 1) {
      dp[i][j][0] = (dp[i - 1][j][0] + dp[i - 1][j][1]) % MOD;
      if (!flag[i] && j < n)
        dp[i][j + 1][1] = dp[i - 1][j][0];
    }
  }
  ll res = 0;
  owo(i, 0, n + 1) {
    ll incl = ((dp[tot][i][0] + dp[tot][i][1]) * fact[n - i]) % MOD;
    if (i & 1) {
      res = (res + MOD - incl) % MOD;
    } else {
      res = (res + incl) % MOD;
    }
  }
  cout << res << "\n";
  return 0;
}