#include #include using namespace std; using namespace atcoder; using ll=long long; using i64=int64_t; static constexpr int mod1=167772161; static constexpr int mod2=469762049; static constexpr int mod3=754974721; static constexpr int r01 = 104391568; static constexpr int r02 = 323560596; static constexpr int r12 = 399692502; static constexpr int r02r12 = 190329765; static constexpr i64 w1 = mod1; static constexpr i64 w2 = i64(mod1) * mod2; template vector arbitrary_mod_convolution(vector a,vector b){ ll MOD=mint::mod(); int n=a.size(),m=b.size(); vector x(n),y(m); for(int i=0;i(x,y); auto z2=convolution(x,y); auto z3=convolution(x,y); static const int W1 = w1%MOD, W2 = w2%MOD; vector res(n+m-1); for(int i=0;i struct FormalPowerSeries : vector{ using vector::vector; template FormalPowerSeries(Args...args) : vector(args...){} FormalPowerSeries operator*(const FormalPowerSeries &b) const; FormalPowerSeries operator+(const FormalPowerSeries &b) const; FormalPowerSeries operator*(T c) const; FormalPowerSeries operator+(T c) const; FormalPowerSeries operator-(const FormalPowerSeries &b) const; FormalPowerSeries operator<<(int x) const; FormalPowerSeries operator>>(int x) const; }; template FormalPowerSeries pre(const FormalPowerSeries &f,int deg){ return FormalPowerSeries(begin(f),begin(f)+min((int)f.size(),deg)); } template FormalPowerSeries FormalPowerSeries::operator*(const FormalPowerSeries &b) const { return convolution((*this),b); } template FormalPowerSeries FormalPowerSeries::operator*(T c) const { FormalPowerSeries res(this->size()); for(int i=0;isize();i++) res[i]=(*this)[i]*c; return res; } template FormalPowerSeries FormalPowerSeries::operator+(const FormalPowerSeries &b) const { FormalPowerSeries res=(*this); if(b.size()>this->size()) res.resize(b.size()); for(int i=0;i FormalPowerSeries FormalPowerSeries::operator+(T c) const { FormalPowerSeries res=(*this); res[0]+=c; return res; } template FormalPowerSeries FormalPowerSeries::operator-(const FormalPowerSeries &b) const { FormalPowerSeries res=(*this); if(b.size()>this->size()) res.resize(b.size()); for(int i=0;i FormalPowerSeries FormalPowerSeries::operator<<(int x) const { FormalPowerSeries res(x,0); res.insert(res.end(),begin(*this),end(*this)); return res; } template FormalPowerSeries FormalPowerSeries::operator>>(int x) const { FormalPowerSeries res; res.insert(res.end(),begin(*this)+x,end(*this)); return res; } template FormalPowerSeries integral(const FormalPowerSeries &f){ int n=(int)f.size(); FormalPowerSeries res(n+1,0); for(int i=0;i FormalPowerSeries diff(const FormalPowerSeries &f){ int n=(int)f.size(); FormalPowerSeries res(n-1,0); for(int i=1;i FormalPowerSeries inv(const FormalPowerSeries &f,int deg=-1){ assert(f[0]!=0); if(deg<0) deg=(int)f.size(); FormalPowerSeries res({T(1)/f[0]}); for(int i=1;i FormalPowerSeries log(const FormalPowerSeries &f,int deg=-1){ assert(f[0]==1); if(deg<0) deg=(int)f.size(); FormalPowerSeries res=integral(pre(diff(f)*inv(f,deg),deg-1)); return res; } template FormalPowerSeries exp(const FormalPowerSeries &f,int deg=-1){ assert(f[0]==0); if(deg<0) deg=(int)f.size(); FormalPowerSeries res(1,1); for(int i=1;i FormalPowerSeries pow(const FormalPowerSeries &f,ll e,int deg=-1){ if(deg<0) deg=(int)f.size(); ll i=0; if(e==0){ FormalPowerSeries res(deg); res[0]=1; return res; } while(i<(int)f.size()&&f[i]==0&&i*e(deg,0); if(i*e>=deg) return FormalPowerSeries(deg,0); T k=f[i]; FormalPowerSeries res=exp(log((f>>i)*k.inv())*T(e),deg)*k.pow(e)<<(e*i); return pre(res,deg); } //任意mod形式的冪級数 template struct BinomCoeff{ vector fac,rfac; BinomCoeff(int siz) : fac(siz), rfac(siz){ fac[0]=1; for(int i=1;i0;i--) rfac[i-1]=rfac[i]*i; } mint fact(int n){ return fac[n]; } mint rfact(int n){ return rfac[n]; } mint C(int n,int k){ if(n mint Bostan_Mori(ll n,FormalPowerSeries P,FormalPowerSeries Q){ while(n){ auto C=Q; for(int i=1;i H; for(int i=(n&1ll);i L; for(int i=0;i>=1; } return P[0]/Q[0]; } using mint=modint998244353; using fps=FormalPowerSeries; int main(){ ll n,k; cin >> n >> k; //めんどすぎて助けてくれ〜 //f=x^2(1-x^k)/(1-2x+x^(k+1))とする //1/(1-x)+1/(1-x)^2f*1/(1-fx^k/(1-x))なので //(1 - 3 x + 3 x^2 + x^(1 + k) - 3 x^(2 + k) + x^(2 + 2 k))/((1-x) (1 - 3 x + 2 x^2 + x^(1 + k) - 2 x^(2 + k) + x^(2 + 2 k))) //大変です.... fps f(k*2+5),g(k*2+5); f[0]+=1,f[1]+=-3,f[2]+=3,f[k+1]+=1,f[k+2]+=-3,f[k*2+2]+=1; g[0]+=1,g[1]+=-3,g[2]+=2,g[k+1]+=1,g[k+2]+=-2,g[k*2+2]+=1; g=g*fps{1,-1}; mint ans=Bostan_Mori(n,f,g); cout << ans.val() << endl; }