注意数组要开成long long 否则会溢出。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 555
#define LL long long
#define FF(i,n) for(i=0;i<n;i++)
LL f[N];
LL ans[N];
LL init[N];
LL buf[N];
void matrixMul(LL a[N],LL b[N],LL n,LL mod)
{
int i,j;
FF(i, n) buf[i]=0;
FF(i, n) FF(j,n) if(a[(i - j + n) % n] && b[j])
buf[i] = (buf[i] + a[(i - j + n) % n] * b[j]);
FF(i, n) a[i] = buf[i] % mod; // 算完后再取模,节省时间
}
void matrixMul(int n,int m,int mod)
{
int i,j;
FF(i,n) ans[i] = (i==0);
while(m > 1)
{
if(m&1) matrixMul(ans, init, n, mod);
matrixMul(init, init, n, mod);
m >>= 1;
}
matrixMul(init, ans, n, mod);
}
int main()
{
int n, mod, d, m;
LL b;
int i, j;
while(cin >> n >> mod >> d >> m)
{
memset(init, 0, sizeof(init));
FF(i, n) scanf("%I64d", &f[i]);
FF(j, d + 1)
{
init[j] = 1;
if(j)init[n - j] = 1;
}
matrixMul(n, m, mod);
FF(i, n)
{
b = 0;
FF(j, n)
{
b += f[j] * init[(i - j + n) % n];
b %= mod;
}
printf("%I64d%s", b, i == n - 1 ? "\n" : " ");
}
}
}