矩阵加速递推

首先矩阵快速幂模板

struct matrix { static constexpr int mod = 1e9 + 7; int x, y; vector<vector<int>> v; matrix() {} matrix(int x, int y) : x(x), y(y) { v = vector<vector<int>>(x + 1, vector<int>(y + 1, 0)); } void I() {// 单位化 y = x; v = vector<vector<int>>(x + 1, vector<int>(x + 1, 0)); for (int i = 1; i <= x; i++) v[i][i] = 1; return; } void display() { // 打印 for (int i = 1; i <= x; i++) for (int j = 1; j <= y; j++) cout << v[i][j] << " \n"[j == y]; return; } friend matrix operator*(const matrix &a, const matrix &b) { //乘法 assert(a.y == b.x); matrix ans(a.x, b.y); for (int i = 1; i <= a.x; i++) for (int j = 1; j <= b.y; j++) for (int k = 1; k <= a.y; k++) ans.v[i][j] = (ans.v[i][j] + a.v[i][k] * b.v[k][j]) % mod; return ans; } friend matrix operator^( matrix x , int y ){ // 快速幂 assert( x.x == x.y ); matrix ans(x.x , x.y); ans.I();//注意一定要先单位化 while( y ){ if( y&1 ) ans = ans*x; x = x * x , y >>= 1; } return ans; } };

例题Luogo P1939

已知数列a,满足

ai={1i{1,2,3}ai1+ax3x4

求数列第n项对109+7取模

设计状态阵mati=[aiai1ai2],则mati+1=[ai+1aiai1]=[ai+ai2aiai1]

可以用待定系数法,加对应项相等解出转移矩阵[101100010]

mat3+n=[101100010]n×mat3


__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/17378413.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示