//数据水得离谱，建议加强 
#include <bits/stdc++.h>
#define For(i,x,y) for(register int i=(x);i<=(y);++i)
#define Rof(i,x,y) for(register int i=(x);i>=(y);--i)
#define Edge(i,x) for(register int i=head[x];i;i=e[i].nxt)
const int N=4e5+10020;
const int mod=924844033;
using namespace std;

vector<int> _1,_x,_x1,_0;//G(x)=1,G(x)=x,G(x)=x+1
int adD(int x,int y){ return x+y>=mod?x+y-mod:x+y; }
int mnS(int x,int y){ return x-y<0?x-y+mod:x-y; }

int qpow(int x,int y){
	int res=1;
	for(;y;y>>=1,x=1ll*x*x%mod) if(y&1) res=1ll*res*x%mod;
	return res;
}
int len,bit,invlen,rev[N],fac[N],invf[N];

void NTT(vector<int> &a,int f){
	For(i,0,len-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
	for(int i=2;i<=len;i<<=1){
		int omega=qpow(5,(mod-1)/i),mid=i>>1;
		if(f==-1) omega=qpow(omega,mod-2);
		for(int j=0;j<len;j+=i)
			for(int k=j,w=1;k<j+mid;++k,w=1ll*w*omega%mod){
				int u=a[k],v=1ll*a[k+mid]*w%mod;
				a[k]=adD(u,v),a[k+mid]=mnS(u,v);
			}		
	}
	if(f==-1) For(i,0,len-1) a[i]=1ll*a[i]*invlen%mod;
}

void init(int n){
	for(len=1,bit=0;len<=n;len<<=1,++bit);
	For(i,0,len-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
	fac[0]=1;
	For(i,1,n) fac[i]=1ll*fac[i-1]*i%mod;
	invf[n]=qpow(fac[n],mod-2);
	Rof(i,n-1,0) invf[i]=1ll*invf[i+1]*(i+1)%mod;	
	invlen=qpow(len,mod-2);
}

struct Poly{
	vector<int> a;
	const int operator [] (const int &x) const {return a[x];}
	const int size()const{ return a.size(); }
	void resize(int x){ a.resize(x); }
	void clear(){ a.clear(); }
	const Poly operator +(const Poly &x)const{
		Poly res; res.resize(len);
		For(i,0,len-1) res.a[i]=a[i];
		For(i,0,len-1) res.a[i]=adD(res[i],x[i]);
		return res;
	}
	const Poly operator * (const Poly &x)const{
		Poly res;res.resize(len);
		For(i,0,len-1) res.a[i]=1ll*a[i]*x.a[i]%mod;
		return res;
	}
};

struct Mat{
	Poly a[2][2];
	void clear(){
		For(i,0,1) For(j,0,1){
			a[i][j].resize(1);
			a[i][j].a[0]=0;
		}	
	}
};
void debug(vector<int> &x){
	For(i,0,(int)x.size()-1) printf("%d ",x[i]);puts("");	
}
Mat mat[20],res,oo,aa;

Poly tmp,G,H;
void Minit(){
	mat[0].a[0][0].a=_1;
	mat[0].a[1][0].a=_1;
	mat[0].a[0][1].a=_x;
	mat[0].a[1][1].a=_0;
	For(x,1,16){
		mat[x]=oo;
		For(i,0,1) For(k,0,1) For(j,0,1){
			mat[x].a[i][j]=mat[x].a[i][j]+mat[x-1].a[i][k]*mat[x-1].a[k][j];
		}
	} 	
}
void getpow(int x,int y){
	if(x<0) return;
	y=2*y;
	res.a[0][0].a=_1;
	res.a[0][1].a=_x;
	res.a[1][1].a=_0;
	res.a[1][0].a=_0;
	For(p,0,16) if((x>>p)&1){
		aa=oo;
		For(i,0,1) For(k,0,1) For(j,0,1){
			aa.a[i][j]=aa.a[i][j]+res.a[i][k]*mat[p].a[k][j];
		}
		res=aa;				
	}			
	For(i,0,len-1) tmp.a[i]=res.a[0][0].a[i]+res.a[0][1].a[i];
	
	for(;y;y>>=1){
		if(y&1) G=G*tmp;
		tmp=tmp*tmp;
	} 
}
int ans[N],cnt[2],pos[2]={-1,-1};
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	
	init(2*n);
	tmp.resize(len);
	_1.resize(len),_1[0]=1;
	_x.resize(len),_x[0]=0,_x[1]=1;
	_x1.resize(len),_x1[0]=1,_x1[1]=1;
	_0.resize(len);
	NTT(_1,1),NTT(_x,1),NTT(_x1,1);
	
	For(i,0,1) For(j,0,1) oo.a[i][j].a=_0;
	Minit();
	G.a=_1;
	For(i,1,m){
		int p=0;
		for(int j=i;j<=n;j+=m) ++p;
		--p;
		if(pos[0]!=p){
			if(pos[0]==-1) pos[0]=p,cnt[0]=1;
			else{
				if(pos[1]==-1) cnt[1]=1,pos[1]=p;
				else cnt[1]++;
			}
		} else cnt[0]++;
	}
	getpow(pos[0]-1,cnt[0]);
	getpow(pos[1]-1,cnt[1]);
	
	NTT(G.a,-1);
	For(i,0,n) G.a[i]=1ll*G[i]*fac[n-i]%mod*fac[i]%mod;
	For(i,n+1,len-1) G.a[i]=0;
	For(i,0,n/2) swap(G.a[i],G.a[n-i]);
//	debug(G.a);
	H.resize(len);
	For(i,0,n){
		if(i&1) H.a[i]=mod-invf[i];
		else H.a[i]=invf[i];
	}
	NTT(G.a,1),NTT(H.a,1);
	G=G*H;
	NTT(G.a,-1);
//	debug(G.a);
	
	For(i,0,n) ans[i]=1ll*invf[i]*G[n-i]%mod;
	printf("%d\n",ans[0]);
}

Measured memory_bytes: 5220