3990 [模板]矩阵快速幂 洛谷luogu

题目背景

矩阵快速幂

题目描述

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

-------------------------------------------------

ahaha operator *(const ahaha &x,const ahaha &y){     //重载运算符
//ahaha 是自定义的结构体
ahaha z;
    for(int k=1;k<=n;++k)
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;
    return z;
}

重载运算符

---------------------------------------------------------------------------------

#include<iostream>
#include<cstring>
#define mod 1000000007
#define ll long long
using namespace std;#include<iostream>
#include<cstring>
#define mod 1000000007
#define ll long long
using namespace std;

struct Mat{
    ll m[101][101];
};//结构体存矩阵 
Mat a,e;//a是输入的矩阵,e是单位矩阵 

ll n,p;

Mat Mul(Mat x,Mat y) //矩阵乘 
{
    Mat c;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        c.m[i][j]=0;
    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+x.m[i][k]*y.m[k][j]%mod;
          }
    return c; 
}

Mat pow(Mat x,ll y) //矩阵快速幂 
{
    Mat ans=e;
    while(y)
    {
        if(y&1)
         ans=Mul(ans,x);  
        x=Mul(x,x);
        y>>=1;
    }
    return ans;
}

int main()
{
    //输入 
    cin>>n>>p;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        cin>>a.m[i][j];
     //算法核心     
    for(int i=1;i<=n;i++)
        e.m[i][i]=1;    
    Mat ans=pow(a,p);
    //输出 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
          cout<<ans.m[i][j]%mod<<" ";
        cout<<endl;
    }  

    return 0;

 

 

 

posted @ 2019-01-23 10:23  darrrr  阅读(119)  评论(0编辑  收藏  举报