矩阵快速幂

用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算出来的时间。

原文地址:https://www.cnblogs.com/xingkongyihao/p/8999597.html