算法 | 矩阵加速算法
矩阵加速算法:使用矩阵加速数列递推式的计算。
构造矩阵形式递推式
例如递推式:
如果直接用这个多项式形式递推式来进行递推,时间复杂度为:
我们列出递推式对应的方程组:
写成矩阵形式:
那么即可得到每一项:
矩阵快速幂
由于矩阵乘法也满足
对于上述例子:
通过快速幂来处理
模板
vector<vector<ll>> mat_mul(vector<vector<ll>> a, vector<vector<ll>> b, ll mod)
{
int n = a.size();
vector<vector<ll>> res(n, vector<ll>(n));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
res[i][j] = (res[i][j] + a[i][k] * b[k][j] % mod) % mod;
return res;
}
矩阵快速幂:
vector<vector<ll>> mat_pow(vector<vector<ll>> a, ll b, ll mod)
{
int n = a.size();
vector<vector<ll>> res(n, vector<ll>(n));
for (int i = 0; i < n; i++)
res[i][i] = 1;
while (b)
{
if (b % 2)
res = mat_mul(res, a, mod);
a = mat_mul(a, a, mod);
b /= 2;
}
return res;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi