#pragma GCC optimize("Ofast") #include #include #include using namespace std; #include template struct combination{ vectorfac,ifac; combination(size_t N=0):fac(1,1),ifac(1,1) { make_table(N); } void make_table(size_t N) { if(fac.size()>N)return; size_t now=fac.size(); N=max(N,now*2); fac.resize(N+1); ifac.resize(N+1); for(size_t i=now;i<=N;i++)fac[i]=fac[i-1]*i; ifac[N]=1/fac[N]; for(size_t i=N;i-->now;)ifac[i]=ifac[i+1]*(i+1); } T factorial(size_t n) { make_table(n); return fac[n]; } T invfac(size_t n) { make_table(n); return ifac[n]; } T P(size_t n,size_t k) { if(nC; int x,K; mint p,q; mint f(int c,int d) { assert(c>=d&&(c-d)%2==0); if(d<=5000)return mint::raw(1); mint ret=0; for(int i=0;abs(i-d)<=c;i+=2*d+4) { ret+=C.C(c,(c+abs(i-d))/2); } for(int i=-2*d-4;abs(i-d)<=c;i-=2*d+4) { ret+=C.C(c,(c+abs(i-d))/2); } for(int i=-2;abs(i-d)<=c;i+=2*d+4) { ret-=C.C(c,(c+abs(i-d))/2); } for(int i=-2-2*d-4;abs(i-d)<=c;i-=2*d+4) { ret-=C.C(c,(c+abs(i-d))/2); } return ret; } const int D=350; mint dp[2][D+2][D+2]; mint ret[2][20001]; void g(int d,int id) { assert(d>=D); const int sz=2*K-d; for(int c=0;c<=sz;c++)ret[id][c]=0; const int w=2*d+4; for(int i=w;i-d<=sz;i+=w) { int v=i-d; for(int c=v;c<=sz;c+=2)ret[id][c]+=C.C(c,(c+v)/2); } for(int i=0;d-i<=sz;i-=w) { int v=d-i; for(int c=v;c<=sz;c+=2)ret[id][c]+=C.C(c,(c+v)/2); } for(int i=-2+w;i-d<=sz;i+=w) { int v=i-d; for(int c=v;c<=sz;c+=2)ret[id][c]-=C.C(c,(c+v)/2); } for(int i=-2;d-i<=sz;i-=w) { int v=d-i; for(int c=v;c<=sz;c+=2)ret[id][c]-=C.C(c,(c+v)/2); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>x>>K; int now=0; dp[now][1][1]=1; for(int i=1;i