Problem p03989 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

#define FOR(i, a, b) for (ll i = (a); i < (ll)(b); i++)
#define REP(i, n) FOR(i, 0, n)
#define YYS(x, arr) for (auto &x : arr)
#define ALL(x) (x).begin(), (x).end()
#define SORT(x) sort((x).begin(), (x).end())
#define REVERSE(x) reverse((x).begin(), (x).end())
#define UNIQUE(x) (x).erase(unique(ALL((x))), (x).end())
#define PW(x) (1LL << (x))
#define SZ(x) ((ll)(x).size())
#define SHOW(x) cout << #x << " = " << x << endl
#define SHOWA(x, n)                                                            \
  for (int yui = 0; yui < n; yui++) {                                          \
    cout << x[yui] << " ";                                                     \
  }                                                                            \
  cout << endl

#define pb emplace_back
#define fi first
#define se second

using namespace std;

typedef long double ld;
typedef long long int ll;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<bool> vb;
typedef vector<ld> vd;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<vpl> gr;
typedef vector<vl> ml;
typedef vector<vd> md;
typedef vector<vi> mi;

const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ld EPS = 1e-12;
// const ll MOD = 1e9+7;
const ll MOD = 924844033;

template <class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <class T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <class T> inline T sq(T a) { return a * a; }

ll in() {
  long long int x;
  scanf("%lld", &x);
  return x;
}
char yuyushiki[1000010];
string stin() {
  scanf("%s", yuyushiki);
  return yuyushiki;
}

// head

struct Mod {
  unsigned n;
  Mod() : n(0) {}
  Mod(ll x) {
    if (x < 0)
      n = x % MOD + MOD;
    else
      n = x % MOD;
  }
};
Mod operator+(Mod a, Mod b) { return Mod(a.n + b.n); }
Mod operator+=(Mod &a, Mod b) { return a = a + b; }
Mod operator-(Mod a) { return Mod(MOD - a.n); }
Mod operator-(Mod a, Mod b) { return Mod(a.n + MOD - b.n); }
Mod operator-=(Mod &a, Mod b) { return a = a - b; }
Mod operator*(Mod a, Mod b) { return Mod((ll)a.n * b.n); }
Mod operator*=(Mod &a, Mod b) { return a = a * b; }
Mod modpow(Mod x, ll k) {
  Mod res = 1;
  while (k) {
    if (k & 1)
      res *= x;
    k /= 2;
    x *= x;
  }
  return res;
}
ll extgcd(ll a, ll b, ll &x, ll &y) {
  ll d = a;
  if (b != 0) {
    d = extgcd(b, a % b, y, x);
    y -= a / b * x;
  } else {
    x = 1, y = 0;
  }
  return d;
}
Mod inv(Mod a) {
  ll x, y;
  assert(extgcd(a.n, MOD, x, y) == 1);
  return Mod(x);
}
Mod operator/(Mod a, Mod b) { return Mod((ll)a.n * inv(b).n); }
Mod operator/=(Mod &a, Mod b) { return a = a / b; }

struct Factorial {
  vector<Mod> v;
  Factorial(int max_n) {
    v = vector<Mod>(max_n, 1);
    FOR(i, 1, max_n) v[i] = v[i - 1] * i;
  }
  int size() { return v.size(); }
  Mod operator[](int id) { return v.at(id); }
};

struct Factorial_inv {
  vector<Mod> v;
  Factorial_inv(Factorial &f) {
    v = vector<Mod>(f.size());
    REP(i, f.size()) v[i] = inv(f[i]);
  }
  Mod operator[](int id) { return v.at(id); }
};

struct Combination {
  Factorial *f;
  Factorial_inv *finv;
  Combination(Factorial &arg_f, Factorial_inv &arg_finv) {
    f = &arg_f;
    finv = &arg_finv;
  }
  Mod operator()(int a, int b) { return (*f)[a] * (*finv)[b] * (*finv)[a - b]; }
};

Factorial fact(100010);
Factorial_inv finv(fact);
Combination comb(fact, finv);

int n, k;

vi G[2010];

bool used[2010];

Mod dp[2][2010];

void dfs(int x, int p) {
  // cout << x << endl;
  used[x] = true;
  YYS(w, G[x]) {
    if (w != p) {
      for (int i = n; i >= 0; i--) {
        dp[0][i] = dp[1][i] + dp[0][i];
        if (i > 0) {
          dp[1][i] = dp[0][i - 1];
        }
      }
      dfs(w, x);
    }
  }
}

void go(int x) {
  if (not used[x]) {
    dfs(x, -1);
    REP(j, n + 1) {
      dp[0][j] += dp[1][j];
      dp[1][j] = 0;
    }
  }
}

int main() {

  n = in();
  k = in();

  REP(i, n) {
    if (i - k >= 0) {
      G[i].pb(n + i - k);
      G[n + i - k].pb(i);
    }
    if (i + k < n) {
      G[i].pb(n + i + k);
      G[n + i + k].pb(i);
    }
  }

  dp[0][0] = 1;
  REP(i, n) {
    go(i);
    go(i + n);
  }

  Mod ans = 0;
  FOR(i, 1, n + 1) {
    Mod res = fact[n - i] * dp[0][i];
    if (i % 2 == 1) {
      ans += res;
    } else {
      ans -= res;
    }
  }

  ans = fact[n] - ans;

  printf("%d\n", (int)ans.n);

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

#define FOR(i, a, b) for (ll i = (a); i < (ll)(b); i++)
#define REP(i, n) FOR(i, 0, n)
#define YYS(x, arr) for (auto &x : arr)
#define ALL(x) (x).begin(), (x).end()
#define SORT(x) sort((x).begin(), (x).end())
#define REVERSE(x) reverse((x).begin(), (x).end())
#define UNIQUE(x) (x).erase(unique(ALL((x))), (x).end())
#define PW(x) (1LL << (x))
#define SZ(x) ((ll)(x).size())
#define SHOW(x) cout << #x << " = " << x << endl
#define SHOWA(x, n)                                                            \
  for (int yui = 0; yui < n; yui++) {                                          \
    cout << x[yui] << " ";                                                     \
  }                                                                            \
  cout << endl

#define pb emplace_back
#define fi first
#define se second

using namespace std;

typedef long double ld;
typedef long long int ll;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<bool> vb;
typedef vector<ld> vd;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<vpl> gr;
typedef vector<vl> ml;
typedef vector<vd> md;
typedef vector<vi> mi;

const ll INF = (ll)1e9 + 10;
const ll INFLL = (ll)1e18 + 10;
const ld EPS = 1e-12;
// const ll MOD = 1e9+7;
const ll MOD = 924844033;

template <class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <class T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <class T> inline T sq(T a) { return a * a; }

ll in() {
  long long int x;
  scanf("%lld", &x);
  return x;
}
char yuyushiki[1000010];
string stin() {
  scanf("%s", yuyushiki);
  return yuyushiki;
}

// head

struct Mod {
  unsigned n;
  Mod() : n(0) {}
  Mod(ll x) {
    if (x < 0)
      n = x % MOD + MOD;
    else
      n = x % MOD;
  }
};
Mod operator+(Mod a, Mod b) { return Mod(a.n + b.n); }
Mod operator+=(Mod &a, Mod b) { return a = a + b; }
Mod operator-(Mod a) { return Mod(MOD - a.n); }
Mod operator-(Mod a, Mod b) { return Mod(a.n + MOD - b.n); }
Mod operator-=(Mod &a, Mod b) { return a = a - b; }
Mod operator*(Mod a, Mod b) { return Mod((ll)a.n * b.n); }
Mod operator*=(Mod &a, Mod b) { return a = a * b; }
Mod modpow(Mod x, ll k) {
  Mod res = 1;
  while (k) {
    if (k & 1)
      res *= x;
    k /= 2;
    x *= x;
  }
  return res;
}
ll extgcd(ll a, ll b, ll &x, ll &y) {
  ll d = a;
  if (b != 0) {
    d = extgcd(b, a % b, y, x);
    y -= a / b * x;
  } else {
    x = 1, y = 0;
  }
  return d;
}
Mod inv(Mod a) {
  ll x, y;
  assert(extgcd(a.n, MOD, x, y) == 1);
  return Mod(x);
}
Mod operator/(Mod a, Mod b) { return Mod((ll)a.n * inv(b).n); }
Mod operator/=(Mod &a, Mod b) { return a = a / b; }

struct Factorial {
  vector<Mod> v;
  Factorial(int max_n) {
    v = vector<Mod>(max_n, 1);
    FOR(i, 1, max_n) v[i] = v[i - 1] * i;
  }
  int size() { return v.size(); }
  Mod operator[](int id) { return v.at(id); }
};

struct Factorial_inv {
  vector<Mod> v;
  Factorial_inv(Factorial &f) {
    v = vector<Mod>(f.size());
    REP(i, f.size()) v[i] = inv(f[i]);
  }
  Mod operator[](int id) { return v.at(id); }
};

struct Combination {
  Factorial *f;
  Factorial_inv *finv;
  Combination(Factorial &arg_f, Factorial_inv &arg_finv) {
    f = &arg_f;
    finv = &arg_finv;
  }
  Mod operator()(int a, int b) { return (*f)[a] * (*finv)[b] * (*finv)[a - b]; }
};

Factorial fact(100010);
Factorial_inv finv(fact);
Combination comb(fact, finv);

int n, k;

vi G[4010];

bool used[4010];

Mod dp[2][4010];

void dfs(int x, int p) {
  // cout << x << endl;
  used[x] = true;
  YYS(w, G[x]) {
    if (w != p) {
      for (int i = n; i >= 0; i--) {
        dp[0][i] = dp[1][i] + dp[0][i];
        if (i > 0) {
          dp[1][i] = dp[0][i - 1];
        }
      }
      dfs(w, x);
    }
  }
}

void go(int x) {
  if (not used[x]) {
    dfs(x, -1);
    REP(j, n + 1) {
      dp[0][j] += dp[1][j];
      dp[1][j] = 0;
    }
  }
}

int main() {

  n = in();
  k = in();

  REP(i, n) {
    if (i - k >= 0) {
      G[i].pb(n + i - k);
      G[n + i - k].pb(i);
    }
    if (i + k < n) {
      G[i].pb(n + i + k);
      G[n + i + k].pb(i);
    }
  }

  dp[0][0] = 1;
  REP(i, n) {
    go(i);
    go(i + n);
  }

  Mod ans = 0;
  FOR(i, 1, n + 1) {
    Mod res = fact[n - i] * dp[0][i];
    if (i % 2 == 1) {
      ans += res;
    } else {
      ans -= res;
    }
  }

  ans = fact[n] - ans;

  printf("%d\n", (int)ans.n);

  return 0;
}