# [题目][蓝桥杯ALGO-60] 矩阵乘方

1、题目链接

http://lx.lanqiao.cn/problem.page?gpid=T104（需要登录且需要 VIP 账户）

2、问题描述

3、输入格式

4、输出格式

5、样例输入

2 2
1 1
0 1

6、样例输出

1 0
0 1

1、常规代码

 1 #include <bits/stdc++.h>
2 using namespace std;
3
4 typedef long long ll;
5
6 ll n, m, c[3][3], a[3][3], res[3][3];
7
8 void multi(ll a[][3], ll b[][3]) {
9     memset(c, 0, sizeof(c));
10      for (int i = 1; i <= 2; i++)
11         for (int j = 1; j <= 2; j++)
12             for (int k = 1; k <= 2; k++)
13                 (c[i][j] += a[i][k] * b[k][j]) %= m;
14     for (int i = 1; i <= 2; i++)
15         for (int j = 1; j <= 2; j++)
16             a[i][j] = c[i][j];
17 }
18
19 int main() {
20     cin >> n >> m;
21     cin >> a[1][1] >> a[1][2] >> a[2][1] >> a[2][2];
22     if (n) {
23         res[1][1] = a[1][1] % m, res[1][2] = a[1][2] % m;
24         res[2][1] = a[2][1] % m, res[2][2] = a[2][2] % m;
25         n--;
26         while (n) {
27             if (n & 1) multi(res, a);
28             multi(a, a);
29             n >>= 1;
30         }
31         cout << res[1][1] << ' ' << res[1][2] << endl;
32         cout << res[2][1] << ' ' << res[2][2];
33     }
34     else cout << "0 0\n0 0";
35     return 0;
36 }

2、矩阵封装类代码

 1 #include <bits/stdc++.h>
2 using namespace std;
3
4 typedef long long ll;
5
6 ll n, m, i, j, k, l;
7
8 class Matrix {
9 public:
10     ll a[2][2];
11     Matrix() {}
12     Matrix(int i, int j, int k, int l):
13         a({{i, j}, {k, l}}) {}
14     friend Matrix operator * (const Matrix x, const Matrix y) {
15         Matrix t;
16         t.a[0][0] = (x.a[0][0] * y.a[0][0] + x.a[0][1] * y.a[1][0]) % m;
17         t.a[0][1] = (x.a[0][0] * y.a[0][1] + x.a[0][1] * y.a[1][1]) % m;
18         t.a[1][0] = (x.a[1][0] * y.a[0][0] + x.a[1][1] * y.a[1][0]) % m;
19         t.a[1][1] = (x.a[1][0] * y.a[0][1] + x.a[1][1] * y.a[1][1]) % m;
20         return t;
21     }
22 };
23
24 int main() {
25     cin >> n >> m;
26     cin >> i >> j >> k >> l;
27     Matrix a(i, j, k, l), res;
28     if (n) {
29         res = a;
30         n--;
31         while (n) {
32             if (n & 1) res = res * a;
33             a = a * a;
34             n >>= 1;
35         }
36         cout << res.a[0][0] % m << ' ' << res.a[0][1] % m << endl;
37         cout << res.a[1][0] % m << ' ' << res.a[1][1] % m ;
38     }
39     else cout << "0 0\n0 0";
40     return 0;
41 }

6.2  快速幂

posted @ 2020-10-23 23:43  jinkun113  阅读(244)  评论(0编辑  收藏  举报