矩阵模板
矩阵模板,包含快速幂,注意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

浙公网安备 33010602011771号