1 #define maxn 15
2
3 int n, k; // n阶方阵的k次幂
4
5 struct matrix//定义一个结构体,方便传递值
6 {
7 int m[maxn][maxn];
8 };
9
10 /*
11 mod由全局定义,mod根据需要可以省去
12 */
13
14 matrix mul(matrix a, matrix b) //矩阵求积, 矩阵乘法
15 {
16 matrix ans;
17 for(int i = 1; i <= n; i++)
18 {
19 for(int j = 1; j <= n; j++)
20 {
21 ans.m[i][j] = 0;
22 for(int k = 1; k <= n; k++)
23 {
24 ans.m[i][j] += (a.m[i][k] * b.m[k][j]) % mod;
25 ans.m[i][j] %= mod; // 这里一定要再次取模
26 }
27 }
28 }
29 return ans;
30 }
31
32 matrix quick_pow(matrix a, int b) //矩阵快速幂
33 {
34 matrix ans;
35 for(int i = 1; i <= n; i++)
36 {
37 for(int j = 1; j <= n; j++)
38 {
39 if(i == j)
40 ans.m[i][j] = 1;
41 else
42 ans.m[i][j] = 0;//这里要初始化为单位矩阵,类比普通快速幂这里初始化为1
43 }
44 }
45 while(b != 0)//方法与普通快速幂相同,只有乘法的实现不同
46 {
47 if(b % 2 == 1)
48 ans = mul(a, ans);
49 a = mul(a, a);
50 b /= 2;
51 }
52
53 return ans;
54 }