问题:求解一个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