#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int LL; typedef pair P; typedef pair LP; const int INF=1<<30; const LL MAX=1e9+7; void array_show(int *array,int array_n,char middle=' '){ for(int i=0;i &vec_s,int vec_n=-1,char middle=' '){ if(vec_n==-1)vec_n=vec_s.size(); for(int i=0;i &vec_s,int vec_n=-1,char middle=' '){ if(vec_n==-1)vec_n=vec_s.size(); for(int i=0;i ostream& operator<<(ostream& os,const vector& v1){ int n=v1.size(); for(int i=0;i ostream& operator<<(ostream& os,const pair& p){ os< istream& operator>>(istream& is,vector& v1){ int n=v1.size(); for(int i=0;i>v1[i]; return is; } template istream& operator>>(istream& is,pair& p){ is>>p.first>>p.second; return is; } templateT ext_gcd(T a,T b,T& x,T& y){ //ax+by=gcd(a,b) if(ab)y+=(x/b)*a,x%=b; if(y>a)x+=(y/a)*b,y%=a; return gcd_val; } templateclass modint{ private: typedef long long int ll; ll val; ll gcd(ll a,ll b){ if(amodint(T a){ val=(ll)a%mod; if(val<0)val+=mod; } ll value()const{return val;} ll get_mod()const{return mod;} modint& operator++(){ val++; if(val==mod)val=0; return *this; } modint operator++(int){ modint ans=*this; ++*this; return ans; } modint& operator--(){ if(val==0)val=mod; val--; return *this; } modint operator--(int){ modint ans=*this; --*this; return ans; } modint& operator+=(const modint& a){ val+=a.value(); if(val>=mod)val-=mod; return *this; } modint& operator-=(const modint& a){ val-=a.value(); if(val<0)val+=mod; return *this; } modint& operator*=(const modint& a){ val*=a.value(); if(val>=mod)val%=mod; return *this; } modint pow(ll index)const{ assert(index>=0); if(prime && index>=mod-1)index%=mod-1; modint a=*this,ans=1; for(ll i=1;i>=0 && i<=index;i<<=1){ if(index&i)ans*=a; a*=a; } return ans; } modint inverse()const{ if(prime){ assert(val!=0); return pow(mod-2); } ll x,y; ll g=ext_gcd(val,mod,x,y); assert(g==1); return x; } modint& operator/=(const modint& a){ if(prime){ *this=(*this)*a.inverse(); return *this; } ll g=gcd(val,a.value()); modint a2=a.value()/g; val/=g; *this=(*this)*a2.inverse(); return *this; } friend modint operator-(const modint& a,const modint& b){return (modint)a-=b;} friend modint operator+(const modint& a,const modint& b){return (modint)a+=b;} friend modint operator*(const modint& a,const modint& b){return (modint)a*=b;} friend modint operator/(const modint& a,const modint& b){return (modint)a/=b;} friend bool operator==(const modint& a,const modint& b){return a.value()==b.value();} friend bool operator!=(const modint& a,const modint& b){return a.value()!=b.value();} friend modint pow(const modint& a,const ll b){return a.pow(b);} modint operator+() const{return *this;} modint operator-() const{return modint()-*this;} friend ostream& operator<<(ostream& os,const modint& a){ os<>(istream& is,modint& a){ ll val; is>>val; a=val; return is; } }; using modint107=modint<1'000'000'007,true>; using modint109=modint<1'000'000'009,true>; using mint=modint<998'244'353,true>; namespace sol{ vector kai; mint calc(int a,int b){ if(b<0 || a>n; m=3*n+6; kai.resize(m); kai[0]=1; for(i=1;i