#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 924844033;
ll fac[2100];
ll res;
int n, k;
vector<ll> prod(vector<ll> a, vector<ll> b) {
int i,j;
vector<ll> c(n+1,0);
for (i=0;i<=n;i++) {
for (j=0;j<=i;j++) c[i] += (a[j]*b[i-j])%MOD;
c[i] %= MOD;
}
return c;
}
vector<ll> base;
vector<ll> power(vector<ll> a, int p) {
if (p==0) return base;
vector<ll> tmp = power(a,p/2);
if (p&1) return prod(prod(tmp,tmp),a);
return prod(tmp,tmp);
}
ll dyn[4200][2100];
vector<ll> calc(int p) {
int i, j;
if (p==0) return base;
memset(dyn,0,sizeof(dyn));
dyn[0][0] = dyn[0][1] = dyn[1][0] = 1;
dyn[1][1] = 2;
for (i=2;i<p;i++) {
dyn[i][0] = 1;
for (j=1;j<=i/2+1;j++) {
dyn[i][j] = (dyn[i-1][j]+dyn[i-2][j-1])%MOD;
}
}
vector<ll> ad(n+1,0);
for (i=0;i<=n;i++) ad[i] = dyn[p-1][i];
return ad;
}
int main() {
int i;
fac[0] = 1;
for (i=1;i<=2010;i++) fac[i] = (fac[i-1]*i)%MOD;
scanf("%d%d",&n,&k);
base.assign(n+1,0);
base[0] = 1;
int s = 1, p, q, a, b;
p = 2*(n-(n-1)/k*k); q = 2*min(k,n-k)-p;
a = (n-1)/k; b = a-1;
vector<ll> fd = prod(power(calc(a),p),power(calc(b),q));
for (i=0;i<=n;i++) {
res += (((s*fac[n-i])%MOD)*fd[i])%MOD;
s = -s;
res %= MOD;
}
res += MOD;
res %= MOD;
printf("%lld\n",res);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:54:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&n,&k);
^