总结了一些相关知识,这里没有给出证明,以后有机会再补上。
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 typedef long long ll; 7 const ll mod = 1000000009; 8 const ll rank = 2; // 矩阵的秩(我们这里都是满秩) 9 10 // 定义矩阵结构体 11 struct mat{ 12 ll A[rank][rank]; 13 void Init(){ // 初始化0矩阵 14 memset(A, 0, sizeof(A)); 15 } 16 void InitI(){ // 初始化单位矩阵 17 memset(A, 0, sizeof(A)); // 唉最开始少了这么一句话,初始化就不对了 18 for(ll i=0;i<rank;i++) 19 A[i][i] = 1; 20 } 21 }; 22 23 // 矩阵乘法 24 mat MatMul(mat a, mat b) 25 { 26 mat s; 27 s.Init(); 28 for(ll i=0;i<rank;i++) 29 for(ll j=0;j<rank;j++){ 30 for(ll k=0;k<rank;k++){ 31 s.A[i][j] += a.A[i][k]*b.A[k][j]; 32 s.A[i][j] %= mod; 33 } 34 } 35 return s; 36 } 37 38 // 矩阵快速幂 39 mat QuickMatPow(mat a, ll n) 40 { 41 mat s; 42 s.InitI(); 43 while(n) 44 { 45 if(n&1) s = MatMul(s, a); 46 a = MatMul(a, a); 47 n >>= 1; 48 } 49 return s; 50 } 51 52 // 快速幂取模 (a^b)%c 53 int QuickPowMod(ll a, ll b, ll c) 54 { 55 int s = 1;a = a%c; 56 while(b) 57 { 58 if(b&1) s = (s*a)%c; 59 b >>= 1; 60 a = (a*a)%c; 61 } 62 return s; 63 } 64 65 // 整数快速幂 x^N 66 int QuickPow(int x,int N) 67 { 68 int res = x, ans = 1; 69 while(N) 70 { 71 if(N&1) ans *= res; 72 res *= res; 73 N = N>>1; 74 } 75 return ans; 76 } 77 78 // 展示矩阵 79 void showMat(mat a) 80 { 81 for(ll i=0;i<rank;i++){ 82 for(ll j=0;j<rank;j++){ 83 cout<<a.A[i][j]<<" "; 84 } 85 cout<<endl; 86 } 87 } 88 89 int main() 90 { 91 cout<<QuickPowMod(2, 3, 5)<<endl; 92 cout<<QuickPow(2, 8)<<endl; 93 cout<<"输入矩阵:"<<endl; 94 mat a; 95 a.A[0][0] = 1; 96 a.A[0][1] = 1; 97 a.A[1][0] = 1; 98 a.A[1][1] = 0; 99 // 两个矩阵相乘 100 mat s = MatMul(a, a); 101 showMat(s); 102 // 矩阵快速幂 103 mat arr = QuickMatPow(a, 10000000000); 104 showMat(arr); 105 106 return 0; 107 }
2019-01-13
20:45:16