P3390 【模板】矩阵快速幂

题目背景

矩阵快速幂

题目描述

给定n*n的矩阵A,求A^k

输入输出格式

输入格式:

 

第一行,n,k

第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素

 

输出格式:

 

输出A^k

共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7

 

输入输出样例

输入样例#1: 复制
2 1
1 1
1 1
输出样例#1: 复制
1 1
1 1

说明

n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂

 

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 105
#define mod 1000000007
using namespace std;

long long n,k;
struct Matrix
{
    long long matrix[N][N];
}a;

Matrix Matrix_Mul(Matrix a,Matrix b)
{
    Matrix c;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            c.matrix[i][j]=0;
            for(int k=0;k<n;k++)
                c.matrix[i][j]=(c.matrix[i][j]+a.matrix[i][k]*b.matrix[k][j])%mod;
        }
    return c;
}

void Matrix_Pow(long long k)
{
    Matrix b=a;
    while(k>0)
    {
        if(k&1) a=Matrix_Mul(a,b);
        b=Matrix_Mul(b,b);
        k>>=1;
    }
}

int main()
{
    scanf("%lld%lld",&n,&k);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            scanf("%lld",&a.matrix[i][j]);
    Matrix_Pow(k-1);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        printf("%lld ",a.matrix[i][j]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2018-04-08 07:55  whymhe  阅读(173)  评论(0编辑  收藏  举报