题意:一个二元函数S(i, t)
满足下列方程:
给出,其中N为i的个数,需要求出的值
思路:矩阵快速幂,递推式如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 50+10;
const int inf = 0x3f3f3f3f;
int n, m, A, B, C, T, s[maxn][maxn], x[maxn][maxn], temp[maxn][maxn];
void mul(int a[maxn][maxn], int b[maxn][maxn])
{
memset(temp, 0, sizeof(temp));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
temp[i][j] = temp[i][j]%m + a[i][k]*b[k][j]%m;
memcpy(a, temp, sizeof(temp));
}
void pow_mod(int a[maxn][maxn], int k)
{
int t[maxn][maxn];
memcpy(t, a, sizeof(t));
while (k) {
if (k&1) mul(t, a);
mul(a, a);
k >>= 1;
}
memcpy(a, t, sizeof(t));
}
int main()
{
// freopen("test.txt", "r", stdin);
while (~scanf("%d%d%d%d%d%d", &n, &m, &A, &B, &C, &T)) {
if (n+m+A+B+C+T == 0) break;
memset(s, 0, sizeof(s));
memset(x, 0, sizeof(x));
for (int i = 0; i < n; i++) {
scanf("%d", &s[i][0]);
}
if (T == 0) {
for (int i = 0; i < n; i++)
printf("%d%c", s[i][0], i == n-1 ? '\n' : ' ');
continue;
}
for (int i = 0; i < n; i++) {
if (i-1 >= 0)
x[i][i-1] = A;
if (i+1 < n)
x[i][i+1] = C;
x[i][i] = B;
}
pow_mod(x, T-1);
mul(x, s);
for (int i = 0; i < n; i++)
printf("%d%c", x[i][0]%m, i == n-1 ? '\n' : ' ');
}
return 0;
}