#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
int rev[N<<2];
ll n,m;
ll a[N<<2],b[N<<2],c[N<<2];
ll a1[N<<2],b1[N<<2];
ll x[4][N<<2];
const ll p[4]={0,998244353,2281701377,469762049},G=3;// 3 个都有原根 3 的大模数
const ll p_12=p[1]*p[2];
ll fastpow(ll x,ll y,ll mod){
ll ret=1;
for(;y;y>>=1,x=x*x%mod)
if(y&1) ret=ret*x%mod;
return ret;
}
const ll inv1=fastpow(p[1],p[2]-2,p[2]),inv2=fastpow(p_12%p[3],p[3]-2,p[3]);
void NTT(ll *y,int len,int on,ll P){
ll Gi=fastpow(G,P-2,P);
for(int i=0;i<len;i++)
if(i<rev[i])
swap(y[i],y[rev[i]]);
for(int mid=1;mid<len;mid<<=1){
ll wn=fastpow(on==1?G:Gi,(P-1)/(mid<<1),P);
for(int j=0;j<len;j+=(mid<<1)){
ll w=1;
for(int k=0;k<mid;k++,w=w*wn%P){
ll u=y[j+k],t=w*y[j+k+mid]%P;
y[j+k]=(u+t)%P;
y[j+k+mid]=(u-t+P)%P;
}
}
}
}
void calc(ll *A,ll *B,int len,ll P,ll *ans){// 计算某个模数 P 下的 NTT
NTT(A,len,1,P);
NTT(B,len,1,P);
for(int i=0;i<len;i++) A[i]=A[i]*B[i]%P;
NTT(A,len,-1,P);
ll inv=fastpow(len,P-2,P);
for(int i=0;i<=n+m;i++) ans[i]=A[i]*inv%P;
}
void MTT(ll *A,ll *B,int len,ll P,ll *C){// 进行 3 次不同模数下的 NTT,然后通过中国剩余定理合并得到答案
for(int i=1;i<=3;i++){
memcpy(a1,a,sizeof(a1));
memcpy(b1,b,sizeof(b1));
calc(a1,b1,len,p[i],x[i]);
}
for(int i=0;i<=n+m;i++){
ll ret=(x[2][i]-x[1][i]+p[2])%p[2]*inv1%p[2]*p[1]+x[1][i];
C[i]=((x[3][i]-ret%p[3]+p[3])%p[3]*inv2%p[3]*(p_12%P)%P+ret)%P;
}
}
int main(){
ll P;
scanf("%lld%lld%lld",&n,&m,&P);
for(int i=0;i<=n;i++) scanf("%lld",&a[i]),a[i]%=P;
for(int i=0;i<=m;i++) scanf("%lld",&b[i]),b[i]%=P;
int len=1,l=0;
while(len<=n+m) len<<=1,l++;
for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
MTT(a,b,len,P,c);
for(int i=0;i<=n+m;i++)
printf("%lld ",c[i]);
return 0;
}