矩阵快速幂
矩阵快速幂
一、例:
斐波那契数列
第一个矩阵是转移矩阵记为s,第二个矩阵是当前状态dp[n],等号右边是下一状态记为dp[n+1];
二、当需要递推K次时:
s的K次方*dp[1]=dp[K];
所以s可以利用快速幂的思想来求(注意:快速幂以2为底倍增,事实上你可以用任何大小作为底,只要能更快的求出你想要的结果;详见牛客多校2019-8-1第五场 B)
一些简单的递推式:
1.f(n)=a*f(n-1)+b*f(n-2)+c;(a,b,c是常数)
2.f(n)=c^n-f(n-1) ;(c是常数)
三、板子:
-
struct Mat { ///结构体,矩阵类型 int m[M][M]; } res,e; void init_e(){ //整数快速幂默认的ans是1,矩阵的话ans应为单位矩阵 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) e.m[i][j]=1; else e.m[i][j]=0; } } } Mat Mul(Mat a,Mat b,int n) { Mat tmp;//定义一个临时的矩阵,存放A*B的结果 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { tmp.m[i][j] = 0; } } for(itn i=1; i <= n; i++) { for(int j = 1; j <= n; j++) { for(int k = 1; k <= n; k++) { tmp.m[i][j] += a.m[i][k]*b.m[k][j]; } } } return tmp; } ///矩阵快速幂,求矩阵res的N次幂 Mat Mat_qpower(Mat base,int K){ res=e; while(K) { if(K&1) res=Mul(res,base); base=Mul(base,base); K=K>>1; } return res; }
本文作者:GeraldG
本文链接:https://www.cnblogs.com/geraldg/p/11290905.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步