#include using namespace std; #include #include using namespace atcoder; using mint = atcoder::modint998244353; using vm=vector; vm Berlekamp_Massey(const vm &a) { int n = a.size(); vm c={-1}, c2={0}; mint r2 = 1; int i2 = -1; for(int i = 0; i < n; i++) { mint r = 0; int d = c.size(); for(int j = 0; j < d; j++) r += c[j] * a[i - j]; if(r == 0) continue; mint coef = -r / r2; int d2 = c2.size(); if(d - i >= d2 - i2) { for(int j = 0; j < d2; j++) c[j + i - i2] += c2[j] * coef; } else { vm tmp(c); c.resize(d2 + i - i2); for(int j = 0; j < d2; j++) c[j + i - i2] += c2[j] * coef; c2 = std::move(tmp); i2 = i, r2 = r; } } return {c.begin() + 1, c.end()}; } pair find_generating_function(vm a) { auto q = Berlekamp_Massey(a); int d = q.size(); a.resize(d); q.insert(q.begin(), 1); for(int i = 1; i < (int)q.size(); i++) q[i] *= -1; int da=a.size(); a = convolution(a,q); a.resize(da); return {a, q}; } mint compute_Kthterm(vm p, vm q, long long k) { int d = q.size(); assert(q[0] == 1 and p.size() + 1 <= d); while(k) { auto q_minus = q; for(int i = 1; i < d; i += 2) q_minus[i] *= -1; p.resize(2 * d); q.resize(2 * d); int dp=p.size(); int dq=q.size(); p =convolution(p,q_minus); q =convolution(q, q_minus); p.resize(dp); q.resize(dq); for(int i = 0; i < d - 1; i++) p[i] = p[(i << 1) | (k & 1)]; for(int i = 0; i < d; i++) q[i] = q[i << 1]; p.resize(d - 1); q.resize(d); k >>= 1; } return p[0]; } int main() { long long N,K; cin>>N>>K; vm F(300,0); vm FK(300,0); vm FKS(300,0); F[0]=F[1]=1; FK[0]=FK[1]=1; FKS[0]=1; FKS[1]=2; for(int i=2;i<300;i++){ F[i]=F[i-2]+F[i-1]; FK[i]=F[i].pow(K); FKS[i]=FKS[i-1]+FK[i]; } auto GF=find_generating_function(FKS); auto prob = compute_Kthterm(GF.first,GF.second, N-1); cout<