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

没什么可分析的,就是一道板子题,嘤嘤嘤我刚看到还以为是A*K...........做了半天发现是A^K

矩阵快速幂并没有什么困难的地方,毕竟快速幂大家都会,其实这个代码这么长,无非就是定义了一次矩阵乘法的方式,在定义完之后就可以当普通数据来直接算了

代码如下

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define mod 1000000007
using namespace std;
struct mat {
    long long m[101][101];
} a,e;
long long n,k;
mat cheng(mat A,mat B) {
    mat c;
    memset(c.m,0,sizeof c.m);
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            for(int k=1; k<=n; ++k)
                c.m[i][j]=c.m[i][j]%mod+A.m[i][k]*B.m[k][j]%mod;
    return c;
}
mat quickpower(mat x,long long y) {
    mat anser=e;
    while(y!=0) {
        if(y&1)
            anser=cheng(anser,x);
        x=cheng(x,x);
        y/=2;
    }
    return anser;
}
int main() {
    scanf("%lld %lld",&n,&k);
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            scanf("%lld",&a.m[i][j]);
    for(int i=1; i<=n; i++)
        e.m[i][i]=1;
    mat ans=quickpower(a,k);
    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=n; ++j)
            printf("%lld ",ans.m[i][j]%mod);
        printf("\n");
    }
    return 0;
}

这里的函数cheng()其实就是定义了一个矩阵相乘的方法,类似的,我们也可以用重载运算符来做矩阵的乘法运算,这些都是可以的

posted @ 2019-04-09 20:45  Emiya_Shirou  阅读(215)  评论(0编辑  收藏  举报