#define p 998244353
#define g 3
long long ksm(long long x,long long k)
{
long long s=1;
while(k>0)
{
if(k&1)s=s*x%p;
x=x*x%p;
k>>=1;
}
return s;
}
struct poly
{
long long a[2097152];
void ntt(int);
}A,B;int len;
int r[2097152];
long long w[2097152];
inline long long plus(long long x,long long y){return x+y<p?x+y:x+y-p;}
inline long long jian(long long x,long long y){return x<y?x-y+p:x-y;}
void poly::ntt(int type)
{
for(int i=0;i<len;i++)if(i<r[i])a[i]^=a[r[i]]^=a[i]^=a[r[i]];
w[0]=1;
for(int i=1;i<len;i<<=1)
{
long long wi=ksm(g,type*(p-1)/i/2+p-1);
for(int j=i-2;j>=2;j-=2)w[j]=w[j>>1];
for(int j=1;j<i;j+=2)w[j]=w[j-1]*wi%p;
for(int j=0;j<len;j+=i<<1)
{
for(int k=0;k<i;k++)
{
long long ak=a[j+k],awk=w[k]*a[i+j+k]%p;
a[j+k]=plus(ak,awk);a[i+j+k]=jian(ak,awk);
}
}
}
}
void poly_multiply(unsigned *a,int n,unsigned *b,int m,unsigned *c)
{
len=2097152;
r[0]=0;
for(int i=1;i<len;i++)r[i]=r[i>>1]>>1|(i&1)<<20;
for(int i=0;i<=n;i++)A.a[i]=a[i];
for(int i=0;i<=m;i++)B.a[i]=b[i];
A.ntt(1);B.ntt(1);
for(int i=0;i<len;i++)A.a[i]=A.a[i]*B.a[i]%p;
A.ntt(-1);
long long flen=ksm(len,p-2);
for(int i=0;i<=n+m;i++)c[i]=A.a[i]*flen%p;
}