• 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;

     

     

  • 相关阅读:
    安装iis 安装sql2005安装vs2005
    msdn之构造函数
    winfrom释放word进程 winfrom嵌入word
    看过的好文章,牛人的博客
    数据库相关
    sqlserver得到此数据库所有的表名列名以及列名的类型,字节数等
    c#相关
    c#必须对其强签名
    winform利用读取xml获取webconfig
    JQuery EasyUI Tree
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10307500.html
Copyright © 2020-2023  润新知