矩阵快速幂
用vector:
1 typedef vector<ll> vec; 2 typedef vector<vec> mat; 3 map<ll,ll> mp; 4 mat mul(mat &A, mat &B) { 5 mat C(A.size(), vec(B[0].size())); 6 for(int i = 0; i < A.size(); i ++) { 7 for(int j = 0; j < B[0].size(); j ++) { 8 for(int k = 0; k < B.size(); k ++) { 9 C[i][j] = (C[i][j] + A[i][k]*B[k][j]); 10 } 11 C[i][j] %= mod; 12 } 13 } 14 return C; 15 } 16 17 mat pow(mat A, ll n) { 18 mat B(A.size(), vec(A[0].size())); 19 for(int i = 0; i < B.size(); i ++) B[i][i] = 1; 20 while(n) { 21 if(n&1LL) B = mul(B,A); 22 A = mul(A, A); 23 n >>= 1LL; 24 } 25 return B; 26 }
用结构体,速度比vector快。
1 int len; 2 struct mat{ 3 ll m[len][len]; 4 Nod(){ 5 memset(m, 0, sizeof(m)); 6 } 7 }; 8 mat mul(mat &A, mat &B) { 9 mat C; 10 for(int i = 0; i < len; i ++) { 11 for(int j = 0; j < len; j ++) { 12 for(int k = 0; k < len; k ++) { 13 C.m[i][j] = (C.m[i][j] + A.m[i][k]*B.m[k][j]) % mod; 14 } 15 } 16 } 17 return C; 18 } 19 20 mat pow(mat A, ll n) { 21 mat B; 22 for(int i = 0; i < len; i ++) B.m[i][i] = 1; 23 while(n) { 24 if(n&1LL) B = mul(B,A); 25 A = mul(A, A); 26 n >>= 1LL; 27 } 28 return B; 29 }
同一个题目,左边是用结构体算出来的时间,右边是用vector算出来的时间。