#include <bits/stdc++.h>

#define ll long long
#define N 1000100
#define inf 1000000

using namespace std;

int mod=924844033;

int n,K;

int r[N];

int jc[N],inv[N];

int p2[N];

int f1[N],f2[N];

int len1,len2,tot1,tot2;

int cd1,cd2,cd,pre1,pre2;

int g[N];

ll ansn;

inline int Pow(int x,int y,int mod){
	int ans=1;
	while(y){
		if(y&1) ans=1ll*ans*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return ans;
}

inline void ntt(int nn,int ac[],int check,int mod){
	const int g=5;
	for(int i=0;i<nn;++i)
	  if(i<r[i]) swap(ac[i],ac[r[i]]);
	for(int k=1;k<nn;k<<=1)
	  for(int i=0,Wn=Pow(g,(mod-1)/(k<<1),mod);i<nn;i+=(k<<1))//原根
		for(int j=0,W=1;j<k;j++,W=1ll*Wn*W%mod){
				int x=ac[i+j],y=1ll*W*ac[i+j+k]%mod;
				ac[i+j]=(x+y)%mod,ac[i+j+k]=(x-y+mod)%mod;
			}
	if(check==-1){
		ac[0]=1ll*ac[0]*Pow(nn,mod-2,mod)%mod;
		for(int i=1,inv=Pow(nn,mod-2,mod);i<=nn/2;i++){
			ac[i]=1ll*ac[i]*inv%mod;
			if(i!=nn-i) ac[nn-i]=1ll*ac[nn-i]*inv%mod;
			swap(ac[i],ac[nn-i]);
		}
	}
}

inline void power_Pow(int x[],int y,int cd,int &len){//len与cd不包括常数项

	int ans[N]={0},hc[N]={0},ansc;

	int now=1;

	/*for(int i=0;i<=cd+1;i++)
	printf("cnm:%d\n",x[i]);*/

	ans[0]=1;

	len=0;

	int fn=1,fm=1,ln=0,lm=0;

	while(y){
		if(y&1)
		{
			while(fn<=len+cd) fn<<=1,++ln;

			memcpy(hc,x,4*fn+4);
			
			if(len)
			{
				memset(r,0,4*fn+4);
				for(int i=0;i<fn;++i)
				r[i]=(r[i>>1]>>1)|((i&1)<<(ln-1));
				ntt(fn,hc,1,mod);ntt(fn,ans,1,mod);
				for(int i=0;i<=fn;i++)
				ans[i]=1ll*ans[i]*hc[i]%mod;
				ntt(fn,ans,-1,mod);
			}
			else
			{
				for(int i=fn;i>=0;i--)
				ans[i]=1ll*ans[0]*hc[i]%mod/*,printf("?%d %d %d\n",ans[i],hc[i],i)*/;
			}
			len=len+cd;
		}

		/*for(int i=0;i<=cd;i++)
		printf("FUCK?:%d %d\n",x[i],hc[i]);*/

		while(fm<=cd*2) fm<<=1,++lm;

		memcpy(hc,x,4*fm*2);

		memset(r,0,4*fm+4);
		for(int i=0;i<fm;++i)
		r[i]=(r[i>>1]>>1)|((i&1)<<(lm-1));
		
		ntt(fm,hc,1,mod);
		for(int i=0;i<=fm;i++)
		x[i]=1ll*hc[i]*hc[i]%mod;
		ntt(fm,x,-1,mod);

		memset(hc,0,4*fm*2);

		/*for(int i=0;i<=fm;i++)
		printf("???%d %d\n",x[i],hc[i]);*/

		cd<<=1;
		y>>=1;
	}
	memset(x,0,4*N);
	memcpy(x,ans,4*fn*2);
	len=fn;
	return;
}

inline void pre(){
	jc[0]=1,p2[0]=1;
	for(int i=1;i<=inf;i++)
	jc[i]=1ll*jc[i-1]*i%mod,p2[i]=1ll*p2[i-1]*2%mod;
	inv[inf]=Pow(jc[inf],mod-2,mod);
	for(int i=inf;i>=1;i--)
	inv[i-1]=1ll*inv[i]*i%mod;
	return;
}

inline int read(){
	int x=0;char c=getchar();bool y=1;
	for(;c<'0' || c>'9';c=getchar()) if(c=='-') y=0;
	for(;c>='0' && c<='9';c=getchar()) x=(x<<1)+(x<<3)+c-48;
	if(y) return x;
	return -x;
}

inline int C(int x,int y){
	return 1ll*jc[y]*inv[x]%mod*inv[y-x]%mod;
}

int cl=1,tot=1;

int sum[N];

int main(){
	//freopen("data.in","r",stdin);
	//freopen("2.out","w",stdout);

	n=read(),K=read();

	pre();

	if(K*2>=n){
		for(int i=0;i<=(n-K)*2;i++)
		ansn=(ansn+1ll*(i&1?-1:1)*jc[n-i]%mod*1ll*C(i,2*(n-K)))%mod;
		printf("%lld\n",(ansn+mod)%mod);
		return 0;
	}

	cd1=n/K;
	cd2=n/K+1;
	
	tot2=2*n-2*K*cd1;
	tot1=2*K-tot2;

	/*printf("%d %d %d %d\n",cd1,cd2,tot1,tot2);*/

	for(int i=0;i<=cd1/2;i++){
		f1[i]=C(i,cd1-i);
		//printf("%d\n",f1[i]);
	}

	for(int i=0;i<=cd2/2;i++){
		f2[i]=C(i,cd2-i);
		//printf("%d\n",f2[i]);
	}

	if(cd1)
	power_Pow(f1,tot1,cd1/2,pre1);
	else
	f1[0]=Pow(f1[0],tot1,mod);

	if(cd2)
	power_Pow(f2,tot2,cd2/2,pre2);
	else
	f2[0]=Pow(f2[0],tot2,mod);

	//printf("%d %d\n",pre1,pre2);

	int cd=1,lc=0;
	while(cd<=pre1+pre2) cd<<=1,lc++;

	/*for(int i=0;i<=cd;i++)
	printf("%d %d %d\n",f1[i],f2[i],i);*/

	memset(r,0,4*cd+4);

	for(int i=0;i<cd;++i)
	r[i]=(r[i>>1]>>1)|((i&1)<<(lc-1));

	ntt(cd,f1,1,mod);ntt(cd,f2,1,mod);

	for(int i=0;i<=cd;i++){
		g[i]=1ll*f1[i]*f2[i]%mod;
		//printf("%d %d %d\n",f1[i],f2[i],g[i]);
	}
	
	ntt(cd,g,-1,mod);

	for(int i=0;i<=n;i++)
	{
		//printf("%d %d\n",g[i],i);
		ansn=(ansn+1ll*(i&1?-1:1)*jc[n-i]*g[i])%mod;
	}
	printf("%lld\n",(ansn+mod)%mod);
	return 0;
}

Measured memory_bytes: 32640