import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.io.PrintWriter;import java.lang.reflect.Array;import java.math.BigInteger;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map.Entry;import java.util.Map;import java.util.NoSuchElementException;import java.util.Objects;import java.util.Queue;import java.util.Random;import java.util.Set;import java.util.TreeMap;import java.util.function.BiFunction;import java.util.function.DoubleUnaryOperator;import java.util.function.IntBinaryOperator;import java.util.function.IntFunction;import java.util.function.IntToDoubleFunction;import java.util.function.IntToLongFunction;import java.util.function.IntUnaryOperator;import java.util.function.LongBinaryOperator;import java.util.function.LongToDoubleFunction;import java.util.function.LongUnaryOperator;import java.util.function.Predicate;import java.util.function.ToIntFunction;import java.util.random.RandomGenerator;import java.util.stream.IntStream;import java.util.stream.LongStream;import java.util.stream.Stream;public class Main{static MyPrintWriter pw=MyPrintWriter.getInstance();static FastScanner sc=FastScanner.getInstance();public static void main(String[]args)throws IOException{Thread.setDefaultUncaughtExceptionHandler((t,e)->System.exit(1));new Main().run();pw.flush();}void run(){int N=sc.nextInt();int M=sc.nextInt();long[]A=sc.nextLongs(N);long[]B=sc.nextLongs(N);long[]C=sc.nextLongs(N);Fp fp=Fp.MOD998244353;var mod=fp.modulus();long A1=A[1];var P=PolynomialFpDynamic.MOD998244353;var powG=P.powerProjectionWithKnownInverse(C,N-1);var dot=new long[N];for(int i=0;(iextends RingStrategy{}interface EuclideanDomainStrategyextends GCDDomainStrategy{T div(T a,T b);T mod(T a,T b);long norm(T a);default T canonicalUnit(T a){return one();}@Override default T gcd(T a,T b){while(!equals(b,zero())){a=mod(a,b);T t=a;a=b;b=t;}if(equals(a,zero())){return a;}return div(a,canonicalUnit(a));}record ExtGCDResult(T x,T y,T gcd){}default ExtGCDResultextgcd(T a,T b){T x0=one();T y0=zero();T g0=a;T x1=zero();T y1=one();T g1=b;while(!equals(g1,zero())){T q=div(g0,g1);T nextG=sub(g0,mul(q,g1));T nextX=sub(x0,mul(q,x1));T nextY=sub(y0,mul(q,y1));x0=x1;y0=y1;g0=g1;x1=nextX;y1=nextY;g1=nextG;}if(equals(g0,zero())){return new ExtGCDResult<>(x0,y0,g0);}T u=canonicalUnit(g0);return new ExtGCDResult<>(div(x0,u),div(y0,u),div(g0,u));}}interface ExactDivRingStrategyextends IntegralDomainStrategy{T exactDiv(T a,T b);}class FastScanner{private static FastScanner instance=null;private final InputStream in=System.in;private final byte[]buffer=new byte[1<<16];private int ptr=0;private int buflen=0;private FastScanner(){}public static FastScanner getInstance(){if(instance==null){instance=new FastScanner();}return instance;}private boolean hasNextByte(){if(ptr0;}private int readByte(){if(hasNextByte()){return buffer[ptr++];}else{return-1;}}private boolean isPrintableChar(int c){return(33<=c)&&(c<=126);}public boolean hasNext(){while(hasNextByte()&&(!isPrintableChar(buffer[ptr]))){ptr++;}return hasNextByte();}public long nextLong(){if(!hasNext()){throw new NoSuchElementException();}long n=0;boolean minus=false;int b=readByte();if(b=='-'){minus=true;b=readByte();}while((b>='0')&&(b<='9')){n=((n<<1)+(n<<3))+(b-'0');b=readByte();}return minus?-n:n;}public int nextInt(){return((int)(nextLong()));}public long[]nextLongs(int n){long[]a=new long[n];for(int i=0;iextends IntegralDomainStrategy{T gcd(T a,T b);}interface IntegralDomainStrategyextends CommutativeRingStrategy{}interface LongCommutativeRingStrategy extends LongRingStrategy{}interface LongEuclideanDomainStrategy extends LongGCDDomainStrategy{long div(long a,long b);long mod(long a,long b);long norm(long a);default long canonicalUnit(long a){return one();}@Override default long gcd(long a,long b){while(!equals(b,zero())){a=mod(a,b);long t=a;a=b;b=t;}if(equals(a,zero())){return a;}return div(a,canonicalUnit(a));}record ExtGCDResult(long x,long y,long gcd){}default ExtGCDResult extgcd(long a,long b){long x0=one();long y0=zero();long g0=a;long x1=zero();long y1=one();long g1=b;while(!equals(g1,zero())){long q=div(g0,g1);long nextG=sub(g0,mul(q,g1));long nextX=sub(x0,mul(q,x1));long nextY=sub(y0,mul(q,y1));x0=x1;y0=y1;g0=g1;x1=nextX;y1=nextY;g1=nextG;}if(equals(g0,zero())){return new ExtGCDResult(x0,y0,g0);}long u=canonicalUnit(g0);return new ExtGCDResult(div(x0,u),div(y0,u),div(g0,u));}}interface LongExactDivRingStrategy extends LongIntegralDomainStrategy{long divExact(long a,long b);}interface LongFieldStrategy extends LongEuclideanDomainStrategy,LongExactDivRingStrategy{@Override default long divExact(long a,long b){return div(a,b);}long inv(long a);default long div(long a,long b){return mul(a,inv(b));}default long geometricSum(long a){return inv(sub(one(),a));}@Override default ExtGCDResult extgcd(long a,long b){if(!equals(a,zero())){return new ExtGCDResult(inv(a),zero(),one());}else if(!equals(b,zero())){return new ExtGCDResult(zero(),inv(b),one());}else{return new ExtGCDResult(zero(),zero(),zero());}}}interface LongGCDDomainStrategy extends LongIntegralDomainStrategy{long gcd(long a,long b);}interface LongIntegralDomainStrategy extends LongCommutativeRingStrategy{}interface LongRingStrategy extends LongSemiRingStrategy{long neg(long a);default long sub(long a,long b){return add(a,neg(b));}}interface LongSemiRingStrategy{long zero();long one();long add(long a,long b);long mul(long a,long b);boolean equals(long a,long b);}class MathUtils{public static long modPow(long a,long n,long mod){if(n<0){long inv=MathUtils.modInv(a,mod);return MathUtils.modPow(inv,-n,mod);}if(n==0){return 1;}return(MathUtils.modPow((a*a)%mod,n/2,mod)*((n%2)==1?a:1))%mod;}public static long modInv(long a,long mod){a=((a%mod)+mod)%mod;long[]f0=new long[]{1,0,mod};long[]f1=new long[]{0,1,a};while(f1[2]!=0){long q=f0[2]/f1[2];for(int i=0;i<3;i++){f0[i]-=q*f1[i];}ArrayUtils.swap(f0,f1);}return f0[1]<0?mod+f0[1]:f0[1];}}class MyPrintWriter extends PrintWriter{private static MyPrintWriter instance=null;private MyPrintWriter(){super(System.out);}public static MyPrintWriter getInstance(){if(instance==null){instance=new MyPrintWriter();}return instance;}public void println(long[]a){println(a," ");}public void println(long[]a,String separator){for(int i=0;i,UFDStrategy,ExactDivRingStrategy{Fp fp;public final boolean isNTTFriendly;public final long primitiveRoot;public final int maxPow2;long[][]bitreversedRoots;long[][]bitreversedInvRoots;public static final int FFT_NAIVE_THRESHOLD=128;public static final int FFT_MIN_LENGTH_THRESHOLD=10;public static final PolynomialFpDynamic MOD998244353=new PolynomialFpDynamic(998244353L,3);public static final PolynomialFpDynamic MOD469762049=new PolynomialFpDynamic(469762049L,3);public static final PolynomialFpDynamic MOD167772161=new PolynomialFpDynamic(167772161L,3);public PolynomialFpDynamic(long mod,long primitiveRoot){super(mod);fp=new Fp(mod);this.isNTTFriendly=true;this.primitiveRoot=primitiveRoot;this.maxPow2=Long.numberOfTrailingZeros(mod-1);this.bitreversedRoots=new long[maxPow2+1][];this.bitreversedInvRoots=new long[maxPow2+1][];}void prepareRoots(int n){if(Integer.bitCount(n)!=1){throw new AssertionError();}int sz=Integer.numberOfTrailingZeros(n);if(sz>maxPow2){throw new AssertionError("NTT length exceeds mod - 1 power of two");}if(bitreversedRoots[sz]!=null){return;}long root=MathUtils.modPow(primitiveRoot,(mod-1)/n,mod);long iroot=MathUtils.modInv(root,mod);bitreversedRoots[sz]=new long[n];bitreversedInvRoots[sz]=new long[n];for(int n_=n/2;n_>=1;n_/=2,root=(root*root)%mod,iroot=(iroot*iroot)%mod){long w=1;long iw=1;for(int j=0;j(cur^=k);k/=2);}}}public void fftToBitReversed(long[]a){int n=a.length;int sz=Integer.numberOfTrailingZeros(n);prepareRoots(n);for(int m=1,t=n/2;m<=(n/2);m*=2,t/=2){for(int i=0,k=0;i=1;m/=2,t*=2){for(int i=0,k=0;imaxPow2){throw new AssertionError("NTT length exceeds mod - 1 power of two");}long[]fa=new long[n];long[]fb=new long[n];for(int i=0;iFFT_NAIVE_THRESHOLD))&&(Math.min(n,m)>FFT_MIN_LENGTH_THRESHOLD)){return mulFFT(a,b);}return super.mul(a,b);}@Override public long[]squared(long[]a){if(a.length==0){return new long[0];}if(a.length==1){return new long[]{(a[0]*a[0])%mod};}int len=(2*a.length)-1;if(isNTTFriendly&&(len>FFT_NAIVE_THRESHOLD)){return squaredFFT(a);}return super.squared(a);}private long[]squaredFFT(long[]a){if(a.length==0){return new long[0];}int n=1;int len=(2*a.length)-1;while(nmaxPow2){throw new AssertionError("NTT length exceeds mod - 1 power of two");}long[]fa=new long[n];for(int i=0;i=degB;i--){if(r[i]==0){continue;}long c=(r[i]*invB)%mod;q[i-degB]=c;for(int j=0;j<=degB;j++){r[(i-degB)+j]-=(c*b[j])%mod;if(r[(i-degB)+j]<0){r[(i-degB)+j]+=mod;}}}return resize(q);}public long[]modNaive(long[]a,long[]b){int degA=deg(a);int degB=deg(b);if(degB==(-1)){throw new ArithmeticException("division by zero polynomial");}if(degA=degB;i--){if(r[i]==0){continue;}long c=(r[i]*invB)%mod;for(int j=0;j<=degB;j++){r[(i-degB)+j]-=(c*b[j])%mod;if(r[(i-degB)+j]<0){r[(i-degB)+j]+=mod;}}}return resize(r);}public static class DivModResult{public long[]q;public long[]r;public DivModResult(long[]q,long[]r){this.q=q;this.r=r;}}public DivModResult divmod(long[]a,long[]b){var q=div(a,b);var r=sub(a,mul(q,b));r=resize(r);return new DivModResult(q,r);}public long[]gcdNaive(long[]a,long[]b){a=resize(a);b=resize(b);while(deg(b)!=(-1)){long[]r=modNaive(a,b);a=b;b=r;}return monic(a);}public long[]differentiate(long[]a){long[]ret=new long[a.length];for(int i=1;iFFT_NAIVE_THRESHOLD))&&(degB>=10)){return divFast(a,b);}return divNaive(a,b);}public long[]divFast(long[]a,long[]b){int degA=deg(a);int degB=deg(b);if(degAFFT_NAIVE_THRESHOLD)){return modFast(a,b);}return modNaive(a,b);}public long[]modFast(long[]a,long[]b){long[]q=divFast(a,b);return resize(sub(a,mul(b,q)));}public class HalfGcdResult{public long[]p00;public long[]p01;public long[]p10;public long[]p11;public HalfGcdResult(long[]p00,long[]p01,long[]p10,long[]p11){this.p00=p00;this.p01=p01;this.p10=p10;this.p11=p11;}public long[][]apply(long[]a,long[]b){return new long[][]{resize(add(mul(p00,a),mul(p01,b))),resize(add(mul(p10,a),mul(p11,b)))};}HalfGcdResult swapColumns(){return new HalfGcdResult(p01,p00,p11,p10);}}HalfGcdResult identityMatrix(){return new HalfGcdResult(new long[]{1},new long[]{0},new long[]{0},new long[]{1});}HalfGcdResult leftMulEuclideanStep(HalfGcdResult mat,long[]q){return new HalfGcdResult(mat.p10,mat.p11,sub(mat.p00,mul(q,mat.p10)),sub(mat.p01,mul(q,mat.p11)));}HalfGcdResult multiplyMatrix(HalfGcdResult a,HalfGcdResult b){return new HalfGcdResult(resize(add(mul(a.p00,b.p00),mul(a.p01,b.p10))),resize(add(mul(a.p00,b.p01),mul(a.p01,b.p11))),resize(add(mul(a.p10,b.p00),mul(a.p11,b.p10))),resize(add(mul(a.p10,b.p01),mul(a.p11,b.p11))));}HalfGcdResult halfGcdNaiveOrdered(long[]a,long[]b){int threshold=deg(a)/2;HalfGcdResult mat=identityMatrix();while(deg(b)>threshold){DivModResult dm=divmod(a,b);mat=leftMulEuclideanStep(mat,dm.q);a=b;b=dm.r;}return mat;}public HalfGcdResult halfGcd(long[]a,long[]b){a=resize(a);b=resize(b);int degA=deg(a);int degB=deg(b);if(degB==(-1)){return identityMatrix();}if(degAextgcd(long[]f,long[]g){f=resize(f);g=resize(g);long[]a=f;long[]b=g;long[]x0=new long[]{1};long[]y0=new long[]{0};long[]x1=new long[]{0};long[]y1=new long[]{1};if(Math.max(deg(a),deg(b))<=3072){while(deg(b)!=(-1)){DivModResult dm=divmod(a,b);long[]nx=sub(x0,mul(dm.q,x1));long[]ny=sub(y0,mul(dm.q,y1));a=b;b=dm.r;x0=x1;y0=y1;x1=resize(nx);y1=resize(ny);}}else{if(deg(a)(new long[]{0},new long[]{0},new long[]{0});}long inv=MathUtils.modInv(a[d],mod);return new EuclideanDomainStrategy.ExtGCDResult<>(resize(mul(x0,inv)),resize(mul(y0,inv)),resize(mul(a,inv)));}public long[]evaluateAtGeometricProgression(long[]coeffs,long c,int m){if((coeffs.length==0)||(m==0)){return new long[0];}int n=coeffs.length;if(c==0){long[]result=new long[m];for(int i=0;i0){res[0]=gh[0];}return res;}if(h.length<(N+1)){throw new AssertionError();}long[]ht=Arrays.copyOf(h,N+1);long[]hp=differentiate(ht);long[]hDivW=new long[N+1];for(int i=0;i=n)){return new long[n];}if((d0>0)&&(((n-1)/d0)=n){return new long[n];}ArrayListterms=new ArrayList<>();for(int i=d0+1;(i=0){tmp=((tmp+mod)-((((t.v*res[(bias+j)+1])%mod)*(j+1))%mod))%mod;}j=d-(t.d-1);if(j>=0){tmp=(tmp+((((((t.v*t.d)%mod)*res[bias+j])%mod)*kMod)%mod))%mod;}}res[(bias+d)+1]=(((tmp*inv0)%mod)*fp.inv(d+1))%mod;}return res;}}class PolynomialZnDynamic implements CommutativeRingStrategy{public final long mod;public final Zn zn;public PolynomialZnDynamic(long mod){this.mod=mod;this.zn=new Zn(mod);}protected long addMod(long a,long b){long sum=a+b;return sum>=mod?sum-mod:sum;}protected long subMod(long a,long b){long diff=a-b;return diff<0?diff+mod:diff;}public int countTerms(long[]a,int limit){int count=0;for(long v:a){if(zn.reduce(v)!=0){count++;if(count>limit){return count;}}}return count;}public long[]mulNaive(long[]a,long[]b){long[]c=new long[(a.length+b.length)-1];for(int i=0;i128){return mulCRT(a,b);}return mulNaive(a,b);}public long[]squared(long[]a){if(a.length==0){return new long[0];}if(a.length==1){return new long[]{(a[0]*a[0])%mod};}int len=(2*a.length)-1;if(len>128){return mulCRT(a,a);}return squaredNaive(a);}public long[]squaredNaive(long[]a){int len=(2*a.length)-1;long[]ret=new long[len];for(int i=0;i=mod){ret[i]-=mod;}}return ret;}@Override public long[]neg(long[]a){long[]ret=new long[a.length];for(int i=0;i=0;i--){if(a[i]!=0){return i;}}return-1;}public boolean isZero(long[]f){return deg(f)==(-1);}public long[]resize(long[]a){return Arrays.copyOf(a,Math.max(0,deg(a))+1);}public static class Term{public final int d;public final long v;public Term(int d,long v){this.d=d;this.v=v;}}public long[]sparseMul(long[]a,ArrayListsparseTerms,int sparseLen){if((a.length==0)||(sparseLen==0)){return new long[0];}long[]res=new long[(a.length+sparseLen)-1];if(sparseTerms.isEmpty()){return res;}for(int i=0;igetTerms(long[]p,int initialCapacity){ArrayListterms=new ArrayList<>(initialCapacity);for(int i=0;iextends SemiRingStrategy{T neg(T a);default T sub(T a,T b){return add(a,neg(b));}}interface SemiRingStrategy{T zero();T one();T add(T a,T b);T mul(T a,T b);boolean equals(T a,T b);default T pow(T a,long n){if(n<0){throw new IllegalArgumentException("Exponent must be non-negative");}T res=one();T base=a;while(n>0){if((n&1)==1){res=mul(res,base);}base=mul(base,base);n>>=1;}return res;}default boolean isZero(T a){return equals(zero(),a);}default boolean isOne(T a){return equals(one(),a);}default int hashCode(T a){return Objects.hashCode(a);}}interface UFDStrategyextends GCDDomainStrategy{}class Zn implements LongCommutativeRingStrategy{final long mod;public Zn(long mod){this.mod=mod;}public long modulus(){return this.mod;}@Override public long zero(){return 0;}@Override public long one(){return 1%mod;}public long pow(long a,long n){if(n<0){throw new AssertionError();}return MathUtils.modPow(a,n,mod);}public static long crt(long[]a,long[]m){int N=a.length;long fac=1;long x=0;for(int i=0;i