矩阵快速幂
写在前面的话:这个东西自学的,所以不大会, 错误的地方敬请指出。
前置知识
快速幂
放个模板
template <class T> T power (T a, int b) { T res = 1; for (; b; b >>= 1, a *= a) { if (b & 1) { res *= a; } } return res; }
因为比较简单,就不讲了。。。(其实是太懒。
一些东西
矩阵就是一个二位数组, 对于加法减法只需要直接计算就可以了。
运算
乘法
特殊一点的是乘法。
代码比较简单
#define vec std::vector<i64> #define mat std::vector<vec> std::function<mat(mat, mat)> mul = [&](mat a, mat b) { mat res(n, vec(n)); for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { res[i][j] = (res[i][j] + a[i][k] * b[k][j] % P) % P; } } } return res; };
快速幂
矩阵求快速幂也是很简单,只需要把乘号替换成上面的那个东西就可以了。
std::function<mat(mat, i64)> power = [&](mat a, i64 k) { mat res(n, vec(n)); // 定义单位矩阵 for (int i = 0; i < n; i++) { res[i][i] = 1; } while (k) { if (k & 1) { res = mul(res, a); } a = mul(a, a); k >>= 1; } return res; };
原因
可以发现,使用矩阵快速幂把递推的计算变成了乘的计算。
从某种意义上来说加速了递推的速度,比如把求斐波那契数列的第 项时间复杂度为 变成 的神奇加速。
本文作者:落花月朦胧
本文链接:https://www.cnblogs.com/falling-flowers/p/16016776.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步