#pragma once
template<classmint>structFormalPowerSeries:vector<mint>{usingvector<mint>::vector;usingFPS=FormalPowerSeries;FPS&operator+=(constFPS&r){if(r.size()>this->size())this->resize(r.size());for(inti=0;i<(int)r.size();i++)(*this)[i]+=r[i];return*this;}FPS&operator+=(constmint&r){if(this->empty())this->resize(1);(*this)[0]+=r;return*this;}FPS&operator-=(constFPS&r){if(r.size()>this->size())this->resize(r.size());for(inti=0;i<(int)r.size();i++)(*this)[i]-=r[i];return*this;}FPS&operator-=(constmint&r){if(this->empty())this->resize(1);(*this)[0]-=r;return*this;}FPS&operator*=(constmint&v){for(intk=0;k<(int)this->size();k++)(*this)[k]*=v;return*this;}FPS&operator/=(constFPS&r){if(this->size()<r.size()){this->clear();return*this;}intn=this->size()-r.size()+1;if((int)r.size()<=64){FPSf(*this),g(r);g.shrink();mintcoeff=g.at(g.size()-1).inv();for(auto&x:g)x*=coeff;intdeg=(int)f.size()-(int)g.size()+1;intgs=g.size();FPSquo(deg);for(inti=deg-1;i>=0;i--){quo[i]=f[i+gs-1];for(intj=0;j<gs;j++)f[i+j]-=quo[i]*g[j];}*this=quo*coeff;this->resize(n,mint(0));return*this;}return*this=((*this).rev().pre(n)*r.rev().inv(n)).pre(n).rev();}FPS&operator%=(constFPS&r){*this-=*this/r*r;shrink();return*this;}FPSoperator+(constFPS&r)const{returnFPS(*this)+=r;}FPSoperator+(constmint&v)const{returnFPS(*this)+=v;}FPSoperator-(constFPS&r)const{returnFPS(*this)-=r;}FPSoperator-(constmint&v)const{returnFPS(*this)-=v;}FPSoperator*(constFPS&r)const{returnFPS(*this)*=r;}FPSoperator*(constmint&v)const{returnFPS(*this)*=v;}FPSoperator/(constFPS&r)const{returnFPS(*this)/=r;}FPSoperator%(constFPS&r)const{returnFPS(*this)%=r;}FPSoperator-()const{FPSret(this->size());for(inti=0;i<(int)this->size();i++)ret[i]=-(*this)[i];returnret;}voidshrink(){while(this->size()&&this->back()==mint(0))this->pop_back();}FPSrev()const{FPSret(*this);reverse(begin(ret),end(ret));returnret;}FPSdot(FPSr)const{FPSret(min(this->size(),r.size()));for(inti=0;i<(int)ret.size();i++)ret[i]=(*this)[i]*r[i];returnret;}FPSpre(intsz)const{returnFPS(begin(*this),begin(*this)+min((int)this->size(),sz));}FPSoperator>>=(intsz){assert(sz>=0);if((int)this->size()<=sz)return{};this->erase(this->begin(),this->begin()+sz);return*this;}FPSoperator>>(intsz)const{if((int)this->size()<=sz)return{};FPSret(*this);ret.erase(ret.begin(),ret.begin()+sz);returnret;}FPSoperator<<=(intsz){assert(sz>=0);this->insert(this->begin(),sz,mint(0));return*this;}FPSoperator<<(intsz)const{FPSret(*this);ret.insert(ret.begin(),sz,mint(0));returnret;}FPSdiff()const{constintn=(int)this->size();FPSret(max(0,n-1));mintone(1),coeff(1);for(inti=1;i<n;i++){ret[i-1]=(*this)[i]*coeff;coeff+=one;}returnret;}FPSintegral()const{constintn=(int)this->size();FPSret(n+1);ret[0]=mint(0);if(n>0)ret[1]=mint(1);automod=mint::get_mod();for(inti=2;i<=n;i++)ret[i]=(-ret[mod%i])*(mod/i);for(inti=0;i<n;i++)ret[i+1]*=(*this)[i];returnret;}minteval(mintx)const{mintr=0,w=1;for(auto&v:*this)r+=w*v,w*=x;returnr;}FPSlog(intdeg=-1)const{assert((*this)[0]==mint(1));if(deg==-1)deg=(int)this->size();return(this->diff()*this->inv(deg)).pre(deg-1).integral();}FPSpow(int64_tk,intdeg=-1)const{constintn=(int)this->size();if(deg==-1)deg=n;if(k==0){FPSret(deg);if(deg)ret[0]=1;returnret;}for(inti=0;i<n;i++){if((*this)[i]!=mint(0)){mintrev=mint(1)/(*this)[i];FPSret=(((*this*rev)>>i).log(deg)*k).exp(deg);ret*=(*this)[i].pow(k);ret=(ret<<(i*k)).pre(deg);if((int)ret.size()<deg)ret.resize(deg,mint(0));returnret;}if(__int128_t(i+1)*k>=deg)returnFPS(deg,mint(0));}returnFPS(deg,mint(0));}staticvoid*ntt_ptr;staticvoidset_ntt();FPS&operator*=(constFPS&r);FPSmiddle_product(constFPS&r)const;voidntt();voidintt();voidntt_doubling();staticintntt_root();FPSinv(intdeg=-1)const;FPSexp(intdeg=-1)const;};template<typenamemint>void*FormalPowerSeries<mint>::ntt_ptr=nullptr;