问题:求解一个N*N矩阵的 M次幂。
核心:构造矩阵。
思想:利用二进制优化时间复杂度。
应用:优化递归公式!!!
举例:求解第N个斐波那契数。
代码实现:
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define MAXN 100
- #define LL long long
- #define MOD 10000
- using namespace std;
- struct Matrix
- {
- LL a[MAXN][MAXN];
- int r, c;//行数 列数
- };
- Matrix ori, res;//初始矩阵 和 结果矩阵
- void init(int n)//初始化矩阵
- {
- memset(res.a, 0, sizeof(res.a));
- res.r = res.c = n;
- for(int i = 1; i <= n; i++)//构造单位矩阵
- res.a[i][i] = 1;
- ori.r = ori.c = n;
- //输入初始矩阵
- for(int i = 1; i <= n; i++)
- {
- for(int j = 1; j <= n; j++)
- scanf("%lld", &ori.a[i][j]);
- }
- }
- Matrix multi(Matrix x, Matrix y)
- {
- Matrix z;
- memset(z.a, 0, sizeof(z.a));
- z.r = x.r, z.c = y.c;//新矩阵行数等于x矩阵的行数 列数等于y矩阵的列数
- for(int i = 1; i <= x.r; i++)//x矩阵的行数
- {
- for(int k = 1; k <= x.c; k++)//矩阵x的列数等于矩阵y的行数 即x.c = y.r
- {
- if(x.a[i][k] == 0) continue;//x矩阵的第i行第k列的数为0不用计算 优化
- for(int j = 1; j<= y.c; j++)//y矩阵的列数
- z.a[i][j] += x.a[i][k] * y.a[k][j];
- }
- }
- return z;
- }
- void Matrix_mod(int n, int m)
- {
- while(m)//M次幂 二进制优化
- {
- if(m & 1)
- res = multi(ori, res);
- ori = multi(ori, ori);
- m >>= 1;
- }
- //得到最后的矩阵
- for(int i = 1; i <= n; i++)
- {
- for(int j = 1; j <= n; j++)
- printf("%lld ", res.a[i][j]);
- printf("\n");
- }
- }
- int main()
- {
- int N, M;
- while(scanf("%d%d", &N, &M) != EOF)
- {
- init(N);//初始化单位矩阵 输入原矩阵
- Matrix_mod(N, M);//矩阵快速幂
- }
- return 0;
- }
输入:
- 2 9
- 1 1
- 1 0
- 2 8
- 1 1
- 1 0
- 55 34
- 34 21
- 34 21
- 21 13