矩阵乘法快速幂
Posted xwww666666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵乘法快速幂相关的知识,希望对你有一定的参考价值。
快速入门视频: av56433157
1> p1926 斐波那契
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; long long n; const int mod=1000000007; long long nw[2][2],ans[2][2]; long long t[2][2]; void mul1() memset(t,0,sizeof(t)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) t[i][j]+=(ans[i][k]*nw[j][k])%mod; for(int i=0;i<2;i++) for(int j=0;j<2;j++) ans[i][j]=t[i][j]; void mul2() memset(t,0,sizeof(t)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) t[i][j]+=(nw[i][k]*nw[j][k])%mod; for(int i=0;i<2;i++) for(int j=0;j<2;j++) nw[i][j]=t[i][j]; void mul3() long long as=0; for(int i=0;i<2;i++) as=(as+ans[0][i])%mod; printf("%lld\n",as); int main() scanf("%lld",&n); n-=2; if(n<=0) printf("1\n"); return 0; nw[0][0]=nw[1][0]=nw[0][1]=1; ans[0][0]=ans[1][1]=1; while(n) if(n&1) mul1(); n>>=1,mul2(); mul3(); return 0;
2>广义斐波那契数列
3>ch30摆花
用矩阵快速幂加速dp,优化时间复杂度和空间复杂度
60->100
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; int n,m; const int N=103,mod=1e9+7; long long nw[N][N],ans[N],t[N][N],tt[N]; void mul1() memset(tt,0,sizeof(tt)); for(int i=0;i<=n;i++) for(int k=0;k<=n;k++) tt[i]=(tt[i] +nw[i][k]*ans[k]%mod) %mod; for(int i=0;i<=n;i++) ans[i]=tt[i]; void mul2() memset(t,0,sizeof(t)); for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) for(int k=0;k<=n;k++) t[i][j]=(t[i][j] +nw[i][k]*nw[k][j]%mod)%mod; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) nw[i][j]=t[i][j]; void mul3() long long as=0; for(int i=0;i<=n;i++) as=(as+ans[i])%mod; printf("%lld\n",as); int main() scanf("%d%d",&m,&n); int x; for(int i=0;i<=n;i++) nw[i][0]=nw[0][i]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%1d",&x); nw[i][j]=x^1; ans[0]=1; while(m) if(m&1) mul1(); m>>=1,mul2(); mul3(); return 0;
以上是关于矩阵乘法快速幂的主要内容,如果未能解决你的问题,请参考以下文章