题解翻译转自此处
题意 f[n]=f[n-1]+2f[n-2]+n4; f[1]=a f[2]=b 求第n项
解析 直接递推肯定会超时的 所以 构造一个77系数矩阵 直接快速幂解出来 由于现在比较菜 只会最简单的矩阵 勉强可以写出来。。。。
1 2 1 0 0 0 0 f[i-1] f[i]
1 0 0 0 0 0 0 f[i-2] f[i-1]
0 0 1 4 6 4 1 i4 (i+1)4
0 0 0 1 3 3 1 * i3 = (i+1) 3
0 0 0 0 1 2 1 i2 (i+1)2
0 0 0 0 0 1 1 i i+1
0 0 0 0 0 0 1 1 1
题意 f[n]=f[n-1]+2*f[n-2]+n^4; f[1]=a f[2]=b 求第n项
解析 直接递推肯定会超时的 所以 构造一个7*7系数矩阵 直接快速幂解出来 由于现在比较菜 只会最简单的矩阵 勉强可以写出来。。。。
1 2 1 0 0 0 0 f[i-1] f[i]
1 0 0 0 0 0 0 f[i-2] f[i-1]
0 0 1 4 6 4 1 i^4 (i+1)^4
0 0 0 1 3 3 1 * i^3 = (i+1)^3
0 0 0 0 1 2 1 i^2 (i+1)^2
0 0 0 0 0 1 1 i i+1
0 0 0 0 0 0 1 1 1
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 4;
const long long MOD = 1e9;
struct Matrix {
long long Ma[MAXN+10][MAXN+10];
int n, m;
void Clear(int u, int un, int um){
n = un, m = um;
for(int i=1;i<=un;i++)
for(int j=1;j<=um;j++)
Ma[i][j] = 0;
if(u) for(int i=1;i<=un;i++)
Ma[i][i] = 1;
}
Matrix operator* (const Matrix& ma) {
Matrix ret ;
ret.Clear(0, n, m);
for(int i=1;i<=n;i++){
for(int j=1;j<=ma.m;j++){
for(int k=1;k<=ma.n;k++){
ret.Ma[i][j] += Ma[i][k] * ma.Ma[k][j];
ret.Ma[i][j] %= MOD;
}
}
}
return ret;
}
};
Matrix Mpow(Matrix m, int p){
Matrix ret;
if(p == 0){
ret.Clear(1, 2, 2);
return ret;
}else if(p == 1) return m;
ret = Mpow(m, p/2);
if(p%2 == 0) return ret * ret;
return (ret * ret) * m;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
Matrix str, _base;
int n;
scanf("%d", &n);
str.Clear(0, n, n);
_base.Clear(0, n, n);
for(int i=1;i<=n;i++) scanf("%lld", &_base.Ma[1][n-i+1]);
for(int i=1;i<=n;i++){
scanf("%lld", &str.Ma[i][1]);
str.Ma[i][i+1] = 1;
}
int k;
scanf("%d", &k);
if(k <= n) printf("%lld\n", _base.Ma[1][n-k+1]);
else{
int ps = k - n;
Matrix ans = Mpow(str, ps);
long long tans = 0;
for(int i=1;i<=n;i++)
tans += (_base.Ma[1][i] * ans.Ma[i][1])%MOD;
printf("%lld\n", (tans%MOD+MOD)%MOD);
}
}
return 0;
}