给出一个递推关系,让你求关系中的第n项
一般遇到数据比较大的递推都可以考虑使用矩阵快速幂
这里矩阵不再描述,白书上有题解
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 20
using namespace std;
int x[MAXN];
int MOD, n, d;
struct Matrix {
int m[MAXN][MAXN];
}A, F;
Matrix Mul(Matrix a, Matrix b) {
Matrix res;
for(int i=1; i<=d; ++i) {
for(int j=1; j<=d; ++j) {
res.m[i][j] = 0;
for(int k=1; k<=d; ++k) {
res.m[i][j] = (res.m[i][j]+a.m[i][k]*b.m[k][j]%MOD+MOD)%MOD;
}
}
}
return res;
}
Matrix Pow(Matrix a, int b) {
Matrix res;
memset(res.m, 0, sizeof(res.m));
for(int i=1; i<=d; ++i)
res.m[i][i] = 1;
while(b) {
if(b & 1)
res = Mul(res, a);
a = Mul(a, a);
b >>= 1;
}
return res;
}
int main(void) {
while(~scanf("%d%d%d", &d, &n, &MOD) && (d||n||MOD)) {
memset(A.m, 0, sizeof(A.m));
memset(F.m, 0, sizeof(F.m));
for(int i=1; i<=d; ++i)
scanf("%d", &x[i]);
for(int i=1; i<d; ++i)
A.m[i][i+1] = 1;
for(int i=1; i<=d; ++i) {
A.m[d][i] = x[d-i+1]%MOD;
}
for(int i=1; i<=d; ++i) {
scanf("%d", &F.m[i][1]);
F.m[i][1] %= MOD;
}
Matrix tmp = Pow(A, n-d);
Matrix ans = Mul(tmp, F);
printf("%d\n", (ans.m[d][1]+MOD)%MOD);
}
return 0;
}