已知 fx = a0fx-1 + a1fx-2 + … + an-1fx-n 和 f0, f1, …, fn-1,给定 t ,求 ft
f 的递推可以看成一个 n × m 的矩阵 A 乘以一个 n 维列向量β,因为矩阵乘法满足结合律,用快速幂可以加速。
时间复杂度:O(n3logt)
输入:
a 常系数数组
b 初值数组
n 数组大小
t 要求解的项数
输出:
函数在第 t 项的值 ft
int solve(int a[], int b[], int n, int t)
{
Matrix M, F, E;
M.clear(), F.clear(), E.clear();
M.n = M.m = n;
E.n = E.m = n;
F.n = n, F.m = 1;
for(int i = 0; i < n - 1; ++i)
M.a[i][i + 1] = 1;
for(int i = 0; i < n; ++i)
{
M.a[n - 1][i] = a[i];
F.a[i][0] = b[i];
E.a[i][i] = 1;
}
if(t < n) return F.a[t][0];
for(t -= n - 1; t; t /= 2)
{
if(t & 1) E = M * E;
M = M * M;
}
F = E * F;
return F.a[n - 1][0];
}