商是对的,余数从莫名其妙的地方开始错
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
const int w0=3;
const int inv=332748118;
const int N=3e6+5;
int n,m,l,limit=1;
int rev[N];
int a[N],b[N],c[N],d[N],q[N],y[N];
int qpow(int n,int m){
int ret=1;
while(m){
if(m&1) ret=ret*n%mod;
n=n*n%mod;
m>>=1;
}
return ret;
}
void NTT(int *A,int type){
for(int i=0;i<limit;i++)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int mid=1;mid<limit;mid<<=1){
int wn=qpow(type==1?w0:inv,(mod-1)/(mid<<1));
for(int j=0,r=mid<<1;j<limit;j+=r){
int w=1;
for(int k=0;k<mid;k++,w=w*wn%mod){
int x=A[j+k],y=w*A[j+mid+k]%mod;
A[j+k]=(x+y)%mod;
A[j+mid+k]=(x-y+mod)%mod;
}
}
}
if(type==1) return ;
int inv=qpow(limit,mod-2);
for(int i=0;i<limit;i++)
A[i]=A[i]*inv%mod;
}
void ni(int len,int *a,int *b){
if(len==1){
b[0]=qpow(a[0],mod-2);
return ;
}
ni((len+1)>>1,a,b);
l=0,limit=1;
while(limit<=(len<<1)) l++,limit<<=1;
for(int i=0;i<limit;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
for(int i=0;i<len;i++) c[i]=a[i];
for(int i=len;i<limit;i++) c[i]=0;
NTT(c,1),NTT(b,1);
for(int i=0;i<limit;i++)
b[i]=(2-b[i]*c[i]%mod+mod)%mod*b[i]%mod;
NTT(b,-1);
for(int i=len;i<limit;i++) b[i]=0;
}
void div(int *A,int *B,int *C){
reverse(A,A+n+1),reverse(B,B+m+1);
ni(n-m+1,B,b);
l=0,limit=1;
while(limit<=(n<<2)) l++,limit<<=1;
for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1)),d[i]=A[i];
NTT(A,1),NTT(b,1);
for(int i=0;i<limit;i++) A[i]=A[i]*b[i]%mod;
NTT(A,-1);
reverse(A,A+n-m+1),reverse(B,B+m+1),reverse(d,d+n+1);
NTT(A,1),NTT(B,1);
for(int i=0;i<limit;i++) B[i]=B[i]*A[i]%mod;
NTT(A,-1),NTT(B,-1);
for(int i=0;i<limit;i++) C[i]=(d[i]-B[i]+mod)%mod;
}
signed main(){
freopen("P4512_4.in","r",stdin);
// freopen("P4512.out","w",stdout);
cin>>n>>m;
for(int i=0;i<=n;i++) scanf("%lld",&q[i]);
for(int i=0;i<=m;i++) scanf("%lld",&a[i]);
div(q,a,y);
for(int i=0;i<=n-m;i++) printf("%lld ",q[i]);
cout<<endl;
for(int i=0;i<m;i++) printf("%lld ",y[i]);
return 0;
}