码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-04 22:47:21      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:比较   eof   递归   code   int   不同的   span   快速   matrix   

模板

快速幂模板

 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,这个时候结果矩阵就要乘以当前的用于运算的矩阵。

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

 

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

标签:比较   eof   递归   code   int   不同的   span   快速   matrix   

原文地址:http://www.cnblogs.com/kickit/p/7287118.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!