#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int m;
int a[510];
int rebase[510][510];
int ans[510];
int NumTurn(int x,int mo){
if(x>mo) x%=mo;
return x;
}
struct row{
int s;
int num[510];
void RowInit(int val){
memset(num,val,sizeof(num));
}
void RowOut(){
for(int i = 1; i <= s; i++){
printf("%d ",num[i]);
}
puts("");
}
row operator *(const row &b) const{
row res;
res.s = s;
res.RowInit(0);
for(int i = 1; i <= res.s; i++){
for(int k = 1; k <= s; k++){
res.num[i]+=(num[k]*b.num[NumTurn(i+k-1,res.s)]);
res.num[i]%=m;
}
}
return res;
}
};
row RowFastPow(row start,int k){
if(k==1) return start;
row t = RowFastPow(start,k>>1);
t = t*t;
if(k&1) return t*start;
return t;
}
int NumberTrans(int x,int mo){
if(x<=0) x = mo+x;
return x;
}
int main(){
int n,d,k;
while(scanf("%d%d%d%d",&n,&m,&d,&k) == 4){
memset(a,0,sizeof(a));
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
row base;
base.s = n;
base.RowInit(0);
for(int i = 1; i <= n; i++){
if((1<=i&&i<=1+d)||(n-d+1<=i&&i<=n)) base.num[i] = 1;
}
base = RowFastPow(base,k);
memset(rebase,0,sizeof(rebase));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
rebase[i][j] = base.num[NumberTrans(j-i+1,n)];
}
}
for(int i = 1; i <= n; i++){
ans[i] = 0;
for(int k = 1; k <= n; k++){
ans[i]+=(rebase[k][i]*a[k]);
ans[i]%=m;
}
}
for(int i = 1; i <= n; i++){
printf("%d ",ans[i]);
}
puts("");
}
return 0;
}