luogu 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 LL long long
int n;LL k;
const int mod = 1e9+7;
struct Matrix {
    LL a[107][107];
    Matrix() {
        std::memset(a,0,sizeof a);
    }
    Matrix operator * (const Matrix & y)const   {
        Matrix ans;
        for(int i=1;i<=n;++i) {
            for(int j=1;j<=n;++j) {
                for(int k=1;k<=n;++k) {
                    ans.a[i][j]=(ans.a[i][j]+((a[i][k]%mod)*(y.a[k][j]%mod)))%mod;
                }
            }
        }
        return ans;
    }
        
}pre,ans;
void pow(LL k) {
    for(int i=1;i<=n;++i) 
        ans.a[i][i]=1;
    while(k) {
        if(k&1) ans=ans*pre;
        pre=pre*pre;
        k>>=1;
    }
    for(int i=1;i<=n;++i) {
        for(int j=1;j<=n;++j) {
            printf("%lld ",ans.a[i][j]);
        }
        puts("");
    }
    return ;
}
int main() {
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;++i) {
        for(int j=1;j<=n;++j) {
            scanf("%d",&pre.a[i][j]);
        }
    }
    pow(k);
    return 0;
}
posted @ 2017-11-07 17:08  zzzzx  阅读(173)  评论(0编辑  收藏  举报