您的位置:首页 > 其它

矩阵快速幂/矩阵加速线性数列 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

未完待续

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: