循环矩阵+矩阵快速幂
参考这里:https://blog.csdn.net/qq_33184171/article/details/52399129
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int N;
ll MOD;
struct node
{
ll a[510];
};
node shu,ans,mp;
//shu是输入的矩阵,ans是所求答案
node matrix(node x,node y)
{
memset(mp.a,0,sizeof(mp.a));
for(int i=1;i<=N;i++)
for(int p=1;p<=N;p++)
{
mp.a[i]=(mp.a[i]+x.a[p]*y.a[(-i+p+N)%N+1])%MOD;
}
return mp;
}
void work(ll k)
{//矩阵快速幂
for(int i=1;i<=N;i++) ans.a[i]=shu.a[i];
node t=shu;
k--;
while(k){
if(k&1)
ans=matrix(ans,t);
k>>=1;
t=matrix(t,t);
}
}
void build(int d)
{
memset(shu.a,0,sizeof(shu.a));
for(int i=1;i<=N;i++)
if(abs(i-1)<=d||N-abs(i-1)<=d)
shu.a[i]=1;
}
ll a[510];
void solve(int d,int k)
{
build(d);
work(k);
for(int i=1;i<=N;i++)
{
ll ret=0;
for(int j=1;j<=N;j++)
ret=(ret+ans.a[(j-i+N)%N+1]*a[j])%MOD;
printf("%lld",ret);
if(i==N) printf("\n");
else printf(" ");
}
}
int main()
{
ll n,m,d,k;
while(~scanf("%lld%lld%lld%lld",&n,&m,&d,&k))
{
N=n;
MOD=m;
for(int i=1;i<=N;i++)
scanf("%lld",&a[i]);
solve(d,k);
}
return 0;
}