您的位置:首页 > 其它

矩阵快速幂 【模板】

2015-08-30 20:11 369 查看
问题:求解一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: