#include<bits/stdc++.h> using namespace std; #define mo 998244353 #define N 500010 #define ll unsigned long long #define int long long #define pl vector<int> int qp(int x,int y){ int r=1; for(;y;y>>=1,x=1ll*x*x%mo) if(y&1)r=1ll*r*x%mo; return r; } int n,m,rev[N],v,le,w[N],p[N],ans[N]; void deb(pl x){ //for(int i:x)cout<<i<<' '; //puts(""); } void init(int n){ v=1; le=0; while(v<n)le++,v*=2; for(signed i=0;i<v;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(le-1)); } int ad(int x,int y){ return (x+=y)>=mo?x-mo:x; } int sb(int x,int y){ return (x-=y)&0x80000000?x+mo:x; } void fft(int v,pl &a,int t){ for(signed i=0;i<v;i++) if(i<rev[i]) swap(a[i],a[rev[i]]); int c=0; w[0]=1; for(signed i=1;i<v;i*=2,c++){ int g=qp(t==1?3:332748118,(mo-1)/(i*2)); for(signed j=i;j>=0;j-=2) w[j]=w[j>>1]; for(signed j=1;j<i;j+=2) w[j]=1ull*w[j-1]*g%mo; for(signed r=i*2,j=0;j<v;j+=r){ int tp=1; for(signed k=0;k<i;k++){ int tx=a[j+k],ty=(1ull*a[j+i+k]*w[k])%mo; a[j+k]=ad(tx,ty); a[j+i+k]=sb(tx,ty); } } //deb(a); } if(!t)return; int iv=qp(v,mo-2); for(signed i=0;i<v;i++) a[i]=1ull*a[i]*iv%mo; } pl operator *(pl x,pl y){ int s=x.size()+y.size()-1; init(s); x.resize(v); y.resize(v); fft(v,x,0); fft(v,y,0); //deb(x); //deb(y); for(int i=0;i<v;i++) x[i]=x[i]*y[i]%mo; fft(v,x,1); //deb(x); x.resize(s); return x; } void inv(int n,pl &b,pl &a){ if(n==1){ b[0]=qp(a[0],mo-2); return; } inv((n+1)/2,b,a); static pl c; init(n*2); c.resize(v); b.resize(v); for(int i=0;i<n;i++) c[i]=a[i]; fft(v,c,0); //deb(c); fft(v,b,0); //deb(b); for(int i=0;i<v;i++) b[i]=1ll*(2ll-1ll*c[i]*b[i]%mo+mo)%mo*b[i]%mo; //deb(b); fft(v,b,1); b.resize(n); //deb(b); } void ad(pl &x,pl y,int l){ x.resize(max((int)x.size(),(int)y.size()+l)); for(int i=0;i<y.size();i++) x[i+l]=(x[i+l]+y[i])%mo; } pl operator +(pl x,pl y){ ad(x,y,0); return x; } pl iv(pl x){ pl y; int n=x.size(); y.resize(n); inv(n,y,x); y.resize(n); return y; } pl operator /(pl a,pl y){ int n=a.size()-1,m=y.size()-1; pl x,b,t; x.resize(n+1); b.resize(m+1); for(int i=0;i<=n;i++) x[n-i]=a[i]; for(int i=0;i<=m;i++) b[m-i]=y[i]; for(int i=n-m+2;i<=m;i++) b[i]=0; b.resize(n-m+1); t=iv(b); //deb(t); //deb(x); //deb(t); x=x*t; //deb(x); x.resize(n-m+1); reverse(x.begin(),x.end()); return x; } pl operator -(pl x,pl y){ int s=max(x.size(),y.size()); x.resize(s); y.resize(s); for(int i=0;i<s;i++) x[i]=(x[i]-y[i]+mo)%mo; return x; } pl operator %(pl x,pl y){ int n=(int)x.size()-1,m=(int)y.size()-1; if(x.size()<y.size())return x; if(!m){ pl a; a.resize(1); return a; } x=x-(x/y)*y; x.resize(m); return x; } inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int rd(){ char ch=nc();int sum=0; while(!(ch>='0'&&ch<='9'))ch=nc(); while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); return sum; } char bf[100]; void wr(int x){ int ct=0; while(x){ bf[++ct]=x%10; x/=10; } for(int i=ct;i;i--) putchar(bf[i]+'0'); putchar(' '); } int p[N]; struct qz{ ll b[N],ans[N]; pl a[N],c[N],t; void fz(int o,int l,int r){ if(l==r){ a[o].resize(2); a[o][0]=(mo-p[l])%mo; a[o][1]=1; return; } int md=(l+r)/2; fz(o*2,l,md); fz(o*2+1,md+1,r); a[o]=a[o*2]*a[o*2+1]; deb(a[o]); } void ga(int o,int l,int r){ if(l==r){ ans[l]=c[o][0]; return; } int md=(l+r)/2; c[o*2]=c[o]%a[o*2]; c[o*2+1]=c[o]%a[o*2+1]; ga(o*2,l,md); ga(o*2+1,md+1,r); } void gt(int n,int m,pl t,int *p){ while(n<m){ n++; t.push_back(0); } fz(1,1,m); if(n>=m)c[1]=t%a[1]; ga(1,1,m); } }; void f2(){ } pl cz(pl x,pl y){ } int n; pl x,y; signed main(){ cin>>n; x.resize(n); y.resize(n); for(int i=0;i<n;i++) cin>>x[i]>>y[i]; pl z=cz(x,y); for(int i=0;i<z.size();i++) printf("%d ",z[i]); }