矩阵快速幂/矩阵加速线性数列 By cellur925
2018-08-23 16:47
281 查看
讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂。现在把它补上。
一、矩阵快速幂
首先我们来说说矩阵。在计算机中,矩阵通常都是用二维数组来存的。矩阵加减法比较简单易懂,两个矩阵相加减就是两个行列数均相等的矩阵的对应位置的数相加减。
矩阵乘法就有些复杂了。它有一些特殊的要求,要求参与矩阵乘法运算的第一个矩阵的列数等于第二个矩阵的行数。所得的矩阵列数为第一个矩阵的列数,行数为第二个矩阵的行数。
举个栗子。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 typedef long long ll; 7 const ll moder=1e9+7; 8 9 int T; 10 ll n; 11 struct matrix{ 12 ll m[10][10]; 13 }ans,sta; 14 15 void init() 16 { 17 memset(ans.m,0,sizeof(ans.m)); 18 for(int i=1;i<=3;i++) ans.m[i][i]=1; 19 memset(sta.m,0,sizeof(sta.m)); 20 sta.m[1][1]=sta.m[1][3]=sta.m[2][1]=sta.m[3][2]=1; 21 } 22 23 matrix mul(matrix a,matrix b) 24 { 25 matrix tmp; 26 memset(tmp.m,0,sizeof(tmp.m)); 27 for(int i=1;i<=3;i++) 28 for(int j=1;j<=3;j++) 29 for(int k=1;k<=3;k++) 30 (tmp.m[i][j]+=(a.m[i][k]%moder)*(b.m[k][j]%moder))%=moder; 31 return tmp; 32 } 33 34 void ksm(ll p) 35 { 36 while(p) 37 { 38 if(p&1) ans=mul(ans,sta); 39 p>>=1; 40 sta=mul(sta,sta); 41 } 42 } 43 44 int main() 45 { 46 scanf("%d",&T); 47 while(T--) 48 { 49 scanf("%lld",&n); 50 if(n<=3){printf("1\n");continue;} 51 init(); 52 ksm(n); 53 printf("%lld\n",ans.m[2][1]); 54 } 55 return 0; 56 }View Code
未完待续
相关文章推荐
- 洛谷 P1939 【模板】矩阵加速(数列):优化递推式的方法——矩阵快速幂
- 矩阵乘法加速fib数列
- 【模板】矩阵加速(数列)
- [矩阵快速幂加速DP] Codeforces 717D Bubble Cup 9 - Finals D. Dexterina’s Lab
- 快速获取数列/矩阵中前项元素累积和
- HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
- HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)
- 【模拟试题】数列 矩阵快速幂
- 矩阵快速幂在常系数线性递推关系中的应用
- 【矩阵快速幂】数列
- P1939 【模板】矩阵加速(数列)
- NZAU 1202: GCD 矩阵快速幂 gcd和fib数列一些结论
- <矩阵快速幂>codevs 3332 数列
- 矩阵快速幂求斐波那契通项(矩阵乘法优化线性递推式)
- 斐波那契数列 打表+矩阵快速幂
- 【矩阵快速幂相乘求Fibonacci 数列】PKU-3070-Fibonacci
- ACdream 1116 扩展KMP 线段树区间累加 Fib数列的矩阵加速
- 矩阵加速线性递推公式
- Bubble Cup X - Finals [Online Mirror] B. Neural Network country 矩阵快速幂加速转移