矩阵模板

矩阵模板,包含快速幂,注意long long int 的开关

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 4;
 4 const long long MOD = 1000000007 ;
 5 #define int long long
 6 struct Mat
 7 {
 8     int mat[maxn][maxn];
 9     int n, m;//n为行数,m为列数
10     Mat(int n, int m):n(n), m(m)
11     {
12         memset(mat, 0, sizeof(mat));
13     }
14     Mat()
15     {
16         n = m = maxn;
17         memset(mat, 0, sizeof(mat));
18     }
19     void init()
20     {
21         for(int i = 0; i < n; i++)mat[i][i] = 1;//初始化成单位矩阵
22     }
23     void output()
24     {
25         for(int i = 0; i < n; i++)
26         {
27             for(int j = 0; j < m; j++)
28             {
29                 cout<<mat[i][j]<<" ";
30             }
31             cout<<endl;
32         }
33     }
34     Mat operator * (const Mat b)const{
35         Mat tmp(n, b.m);//矩阵乘法结果矩阵行数为a的行数,列数为b的列数
36         for (int i = 0; i < n; i++) {
37             for (int k = 0; k < m; k++)//m == b.n(乘法的前提条件)
38                 if (mat[i][k])
39                     for (int j = 0; j < b.m; j++) {
40                         tmp.mat[i][j] = (MOD+tmp.mat[i][j]+mat[i][k] * b.mat[k][j] % MOD)%MOD;
41                     }
42         }
43         return tmp;
44     }//重载会更快
45     Mat pow(int n)const
46     {
47         Mat mat=*this;
48         Mat tmp(mat.n, mat.m);
49         tmp.init();
50         while(n)
51         {
52             if(n & 1)tmp = tmp * mat;
53             n >>= 1;
54             mat = mat * mat;
55         }
56         return tmp;
57     }
58 };
59 #undef int
View Code

 

posted @ 2020-02-23 16:08  dialectics  阅读(130)  评论(0)    收藏  举报