#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define pb push_back #define mp make_pair typedef pair pii; typedef long long ll; typedef double ld; typedef vector vi; #define fi first #define se second #define fe first #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);} #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);} #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);} #define es(x,e) (int e=fst[x];e;e=nxt[e]) #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e]) const int MOD=998244353; #define SZ 666666 ll w[2][SZ]; inline ll qp(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=ans*a%MOD; a=a*a%MOD; b>>=1; } return ans; } int K; inline void fftinit(int n) { for(K=1;Kj) swap(x[i],x[j]); for(int l=K>>1;(j^=l)>=1); } for(int i=2;i<=K;i<<=1) for(int l=0;l>1;l++) { register int W=w[v][K/i*l],*p=x+l+(i>>1),*q=x+l,t; for(register int j=0;j=0)?(q[j]+t-MOD):(q[j]+t); } } if(!v) return; ll rv=qp(K,MOD-2); for(int i=0;i ps; inline int cs() {return ps.size()-1;} inline int& operator [] (int x) {return ps[x];} //ps.at(x) inline void sc(int x) {ps.resize(x+1);} inline void dbg() { bool fi=0; for(int i=cs();i>=0;i--) { ps[i]=(ps[i]%MOD+MOD)%MOD; if(!ps[i]) continue; if(ps[i]>MOD/2) ps[i]-=MOD; if(fi) { if(i==0) printf("%+d",ps[i]); else if(ps[i]==1) printf("+"); else if(ps[i]==-1) printf("-"); else printf("%+d",ps[i]); } else { if(i==0) printf("%d",ps[i]); else if(ps[i]==1); else if(ps[i]==-1) printf("-"); else printf("%d",ps[i]); } if(i>1) printf("x^%d",i); else if(i==1) printf("x"); fi=1; } if(!fi) printf("0"); putchar(10); } inline void clr() { int p=cs()+1; while(p&&!ps[p-1]) --p; sc(p-1); } }; namespace PolyMul{int ta[SZ],tb[SZ],tc[SZ];} inline poly operator * (poly a,poly b) { using namespace PolyMul; if(a.cs()<180||b.cs()<180) { poly g; g.sc(a.cs()+b.cs()); int*G=&g[0],*A=&a[0],*B=&b[0]; for(int i=0;i<=a.cs();i++) { register int*h=G+i,j=0; register ll x=A[i]; for(;j<=b.cs();++j) h[j]=(h[j]+x*(ll)B[j])%MOD; } return g; } poly c; int t=a.cs()+b.cs(); c.sc(t); fftinit(t+1); memset(ta,0,sizeof(int)*K); memset(tb,0,sizeof(int)*K); memset(tc,0,sizeof(int)*K); for(int i=a.cs();i>=0;i--) ta[i]=a[i]; for(int i=b.cs();i>=0;i--) tb[i]=b[i]; fft(ta,0); fft(tb,0); for(int i=0;i=0;i--) c[i]=tc[i]; c.clr(); return c; } namespace PolyInv{int ay[SZ],a0[SZ],tmp[SZ];} inline void ginv(int t) { using namespace PolyInv; if(t==1) {a0[0]=qp(ay[0],MOD-2); return;} ginv((t+1)>>1); fftinit(t+t+3); memset(tmp,0,sizeof(int)*K); for(int i=t;i=0;i--) ay[i]=x[i]; ginv(x.cs()+1); for(int i=x.cs();i>=0;i--) y[i]=a0[i]; y.clr(); return y; } inline poly operator + (poly a,poly b) { poly w; w.sc(max(a.cs(),b.cs())); for(int i=a.cs();i>=0;i--) w[i]=a[i]; for(int i=b.cs();i>=0;i--) (w[i]+=b[i])%=MOD; return w; } inline poly operator - (poly a,poly b) { poly w; w.sc(max(a.cs(),b.cs())); for(int i=a.cs();i>=0;i--) w[i]=a[i]; for(int i=b.cs();i>=0;i--) (w[i]-=b[i])%=MOD; w.clr(); return w; } inline void div(poly a,poly b,poly& d,poly& r) { int n=a.cs(),m=b.cs(); if(n=0;i--) ans=(ans*x+a[i])%MOD; return ans; } poly vvs[SZ]; inline void gvs(int m,int* x,int id) { if(m==1) {vvs[id].sc(1), vvs[id][1]=1, vvs[id][0]=-*x; return;} int hf=m>>1; gvs(hf,x,id*2); gvs(m-hf,x+hf,id*2+1); vvs[id]=vvs[id*2]*vvs[id*2+1]; } namespace PolyGetv{int xs[SZ],anss[SZ];} inline void gv(poly f,int m,int* x,int* ans,int id) { if(f.cs()<=400) { int c=f.cs(),*F=&f.ps[0]; for(int i=0;i>1; gv(f%vvs[id*2],hf,x,ans,id*2); gv(f%vvs[id*2+1],m-hf,x+hf,ans+hf,id*2+1); } inline vector getv(poly a,vector x) { using namespace PolyGetv; a.clr(); if(!x.size()) return vector(); int m=x.size(); for(int i=0;i ans; ans.resize(m); for(int i=0;ir) {f.sc(0); f[0]=1; return f;} int m=(l+r)>>1; f.sc(1); f[0]=1; f[1]=-a[m]; return f*calc(l,m-1)*calc(m+1,r); } poly A,B; int main() { scanf("%d",&n); for(int i=0;i v,aa,bb; for(int i=0;i