Problem:
Score : 900 points

Problem Statement

Snuke loves permutations. He is making a permutation of length N.

Since he hates the integer K, his permutation will satisfy the following:

Let the permutation be a_1, a_2, ..., a_N. For each i = 1,2,...,N, |a_i - i| \neq K.

Among the N! permutations of length N, how many satisfies this condition?

Since the answer may be extremely large, find the answer modulo 924844033(prime).

Constraints

2 ≦ N ≦ 2000

1 ≦ K ≦ N-1

Input

The input is given from Standard Input in the following format:

N K

Output

Print the answer modulo 924844033.

Sample Input 1

3 1

Sample Output 1

2

2 permutations (1, 2, 3), (3, 2, 1) satisfy the condition.

Sample Input 2

4 1

Sample Output 2

5

5 permutations (1, 2, 3, 4), (1, 4, 3, 2), (3, 2, 1, 4), (3, 4, 1, 2), (4, 2, 3, 1) satisfy the condition.

Sample Input 3

4 2

Sample Output 3

9

Sample Input 4

4 3

Sample Output 4

14

Sample Input 5

425 48

Sample Output 5

756765083

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define rep(i, l, r) for(int i = (l), i##end = (r);i <= i##end;++i)
using std::cin; using std::cout;
const int maxn = 4020;
typedef long long ll;
const int mod = 924844033;
inline ll pow(ll a,int b,int ans = 1) {
	for(;b;b >>= 1,a = a * a % mod) if(b & 1)
		ans = ans * a % mod;
	return ans;
}
inline ll inverse(int x){ return pow(x, mod - 2); }
int fac[maxn];
int n, k;
int f[maxn][maxn][2];
int id[maxn];
int main() {
	std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	fac[0] = 1;
	for(int i = 1;i < maxn;++i) fac[i] = (ll) fac[i - 1] * i % mod;
	cin >> n >> k;
	int tot = 0;
	for(int i = 1;i <= k;++i) {
		for(int j = i;j <= n;j += k) id[++tot] = j;
		for(int j = i;j <= n;j += k) id[++tot] = j;
	}
	f[0][0][0] = 1;
	for(int i = 1;i <= tot;++i) {
		for(int j = 0;j <= i + 1 >> 1;++j) {
			f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1]) % mod;
			if(id[i] - id[i - 1] == k && j)
				f[i][j][1] = f[i - 1][j - 1][0];
		}
	}
	int ans = 0;
	for(int i = 0;i <= n;++i) {
		ans = (ans + (i & 1 ? mod - 1 : 1ll) * (f[tot][i][0] + f[tot][i][1]) % mod * fac[n - i]) % mod;
	}
	std::cout << ans << '\n';
}