矩阵快速幂 模板与简单讲解

Posted Omz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵快速幂 模板与简单讲解相关的知识,希望对你有一定的参考价值。

模板

快速幂模板

 1 void solve(matrix t,long long o)
 2 {
 3     matrix e;
 4 
 5     memset(e.a,0,sizeof(e.a));
 6 
 7     for (int i = 0;i < d;i++)
 8         e.a[i][i] = 1;
 9 
10     while (o)
11     {
12         if (o & 1)
13         {
14             e = mul(e,t);
15         }
16 
17         o >>= 1;
18 
19         t = mul(t,t);
20     }
21 
22     long long res = 0;
23 
24     for (int i = 0;i < d;i++)
25         res = (res + e.a[0][i] * f[d-i-1]) % m;
26 
27     printf("%lld\n",res);
28 }

矩阵相乘代码

 1 struct matrix
 2 {
 3     long long a[20][20];
 4 };
 5 
 6 matrix mul(matrix x,matrix y)
 7 {
 8     matrix c;
 9 
10     for (int i = 0;i < d;i++)
11         for (int j = 0;j < d;j++)
12     {
13         c.a[i][j] = 0;
14 
15         for (int k = 0;k < d;k++)
16         {
17             c.a[i][j] = (c.a[i][j] + x.a[i][k] * y.a[k][j] % m) % m;
18         }
19     }
20 
21     return c;
22 }

 

简单讲解:

矩阵快速幂,就只是把快速幂中的数改成了矩阵,兰儿其实还是有不同的地方,因为快速幂一般用的是递归实现,但是lrj大大说矩阵快速幂还是用迭代实现比较好。

举一个例子,A^15,可以写成(A^8) * (A^4) * (A^2) * (A^1) 的形式,可以看到8,4,2,1都是2的次幂,所以我们就可以方便的运用位运算。

15:1111,那么每次这个数字右移一位,那么矩阵就平方一次,然后遇到当前的最后一位111k,k & 1 == 1,这个时候结果矩阵就要乘以当前的用于运算的矩阵。

矩阵预算也是挺好理解的,用手算模拟一下就可以了。

 

以上是关于矩阵快速幂 模板与简单讲解的主要内容,如果未能解决你的问题,请参考以下文章

模板之矩阵快速幂(luogu P3390模板矩阵快速幂)

整数快速幂与矩阵快速幂算法详解

51nod1113(矩阵快速幂模板)

poj 3070 Fibonacci (矩阵快速幂乘/模板)

从矩阵快速幂的泛型模板设计——教你如何优雅的面向对象

模板矩阵快速幂