洛谷 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<cstring>
#include<iostream>
#include<algorithm>
#define mod 1000000007
using namespace std;
int n;
long long k;
long long ans[101][101],t[101][101],r[101][101];
void mul(long long a[101][101],long long b[101][101]){
    memset(r,0,sizeof(r));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                r[i][j]+=a[i][k]*b[k][j],r[i][j]%=mod;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=r[i][j];
}
int main(){
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            scanf("%lld",&ans[i][j]);
            t[i][j]=ans[i][j];
        }
    k-=1;
    for(;k;k>>=1){
        if(k&1)    mul(ans,t);
        mul(t,t);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<ans[i][j]<<" ";
        cout<<endl;
    }
}

 

posted @ 2017-11-07 13:59  一蓑烟雨任生平  阅读(119)  评论(0编辑  收藏  举报