#include <iostream>
#include <algorithm>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <string.h>
#include <stack>
#include <assert.h>
#define Endl endl
#define mp make_pair
#define ll long long 
#define pii pair<int,int>
#define pll pair<ll,ll>
#define over(A) {cout<<A<<endl;exit(0);}
#define all(A) A.begin(),A.end()
#define ceil(a,b) ((a-1)/b+1)
#define srand() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rand(l,r) uniform_int_distribution<int>(l,r)(rng)
typedef unsigned long long ull;
const int inf=1039074182;
using namespace std;
int n,k;
int mod;
int dp[2005][2005];//=i(mod k) (0~k-1)µÄ¶Î£¬Ñ¡È¡ÁËj¸öÔªËØ 
int l1,l2;
int f[2][2005];
bool extra[2005];
int dp2[2005][2005][2][2];

namespace combinatorics
{
	int *fac;
	int *ifac;
	int __Tmod;
	inline int add(int a,int b)
	{
		return (a+b)%__Tmod;
	}
	inline int sub(int a,int b)
	{
		return (a-b+__Tmod)%__Tmod;
	}
	inline int mult(int a,int b)
	{
		return (1LL*a*b)%__Tmod;
	}
	inline int fastpow(int basic,int x)
	{
		int res=1;
		while(x)
		{
			if(x&1)	res=mult(res,basic);
			basic=mult(basic,basic);
			x>>=1;
		}
		return res;
	}
	inline int inv(int x)
	{
		return fastpow(x,__Tmod-2);
	}
	void init(int n,int tmod)
	{
		__Tmod=tmod;
		fac=new int[n+5];
		ifac=new int[n+5];
		fac[0]=1;
		for(int i=1;i<=n;i++)
		{
			fac[i]=mult(fac[i-1],i);
		}
		ifac[n]=inv(fac[n]);
		for(int i=n-1;i>=0;i--)
		{
			ifac[i]=mult(ifac[i+1],i+1);
		}
	}
	inline int C(int n,int m)
	{
		return mult(mult(fac[n],ifac[m]),ifac[n-m]);
	}
	inline int Cat(int x)
	{
		return mult(C(x*2,x),inv(x+1));
	}
};
using namespace combinatorics;


void solve(int n,int f[])
{
	if(n==1)
	{
		f[0]=1;
		f[1]=0;
		return;
	}
	if(n==2)
	{
		f[0]=1;
		f[1]=2;
		f[2]=1;
		return;
	}
	memset(dp2,0,sizeof(dp2));
	dp2[1][0][0][0]=1;
	dp2[1][1][0][1]=1;
	for(int i=1;i<n;i++)
	{
		for(int used=0;used<=i;used++)
		{
			for(int have2=0;have2<2;have2++)
			{
				for(int have3=0;have3<2;have3++)
				{
					dp2[i+1][used][have3][0]+=dp2[i][used][have2][have3];
					if(dp2[i+1][used][have3][0]>=mod) dp2[i+1][used][have3][0]-=mod;
					if(!have2) dp2[i+1][used+1][have3][0]+=dp2[i][used][have2][have3];
					if(dp2[i+1][used+1][have3][0]>=mod) dp2[i+1][used+1][have3][0]-=mod;
					if(i!=n-1) dp2[i+1][used+1][have3][1]+=dp2[i][used][have2][have3];
					if(dp2[i+1][used+1][have3][1]>=mod) dp2[i+1][used+1][have3][1]-=mod;
				}
			}
		}
	}
	for(int i=0;i<=n;i++)
	{
		f[i]=add(add(dp2[n][i][0][0],dp2[n][i][0][1]),add(dp2[n][i][1][0],dp2[n][i][1][1]));
	}
//	cout<<n<<':';
//	for(int i=0;i<=n;i++)
//	{
//		cout<<f[i]<<' ';
//	}
//	cout<<endl;
}

void solve()
{
	int basic=n/k;
	solve(basic,f[0]);
	solve(basic+1,f[1]);
	for(int i=0;i<=n;i++)
	{
		dp[0][i]=f[extra[0]][i];
	}
	for(int i=0;i<k-1;i++)
	{
		for(int j=0;j<=n;j++)
		{
			for(int nadd=0;nadd<=basic+extra[i+1];nadd++)
			{
				if(j+nadd>n) break;
				dp[i+1][j+nadd]=add(dp[i+1][j+nadd],mult(f[extra[i+1]][nadd],dp[i][j]));
			}
		}
	}
//	cout<<f[1][1]<<endl;
//	for(int i=0;i<k;i++)
//	{
//		for(int j=0;j<=n;j++)
//		{
//			cout<<dp[i][j]<<' ';
//		}
//		cout<<endl;
//	}
	int res=0;
	for(int i=0;i<=n;i++)
	{
		if(i&1)
		{
			res=sub(res,mult(dp[k-1][i],fac[n-i]));
		}
		else
		{
			res=add(res,mult(dp[k-1][i],fac[n-i]));
		}
//		cout<<dp[k-1][i]<<'\n';
	}
	cout<<res<<endl;
}

void precalc()
{
	mod=924844033;
	init(n+5,mod);
	int basic=n/k;
	for(int i=0;i<k;i++)
	{
		int s=0;
		for(int j=i;j<n;j+=k,s++);
		if(s==basic) extra[i]=false;else extra[i]=true;
	}
}

int main()
{
//	freopen("input.txt","r",stdin);
	cin>>n>>k;
	precalc();
	solve();
	return 0;
}

Measured memory_bytes: 69888