洛谷3390 矩阵快速幂

来源:互联网 发布:java socket心跳检测 编辑:程序博客网 时间:2024/05/17 08:48

题目背景

矩阵快速幂

题目描述

给定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 算法:矩阵快速幂

Q

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;ll n,m;const ll mod=1e9+7;struct hh{    ll ma[141][141];}a,rec;hh Mar(hh a,hh b){    hh t;    memset(t.ma,0,sizeof(t.ma));    for(ll i=1;i<=n;i++)        for(ll j=1;j<=n;j++)            for(ll k=1;k<=n;k++)                t.ma[i][j]=(t.ma[i][j]%mod+((a.ma[i][k]%mod)*(b.ma[k][j]%mod))%mod)%mod;    return t;}hh ksm(hh a,ll s){    hh b=a;    while(s)    {        if(s&1) rec=Mar(rec,b);        b=Mar(b,b);        s>>=1;    }    return rec;}void solve(){    cin>>n>>m;    for(ll i=1;i<=n;i++)        for(ll j=1;j<=n;j++)            scanf("%lld",&a.ma[i][j]);    rec=a;    ksm(a,m-1);//已经将rec初始化为a,相当于已经计算了一次,所以这里求a^m-1;    for(ll i=1;i<=n;i++)    {        for(ll j=1;j<=n;j++)            printf("%lld ",rec.ma[i][j]);        printf("\n");    }}int main(){    solve();    return 0;}
原创粉丝点击