首页 > 其他分享 >矩阵快速幂

矩阵快速幂

时间:2024-03-03 18:33:58浏览次数:16  
标签:martix int res 矩阵 mp 快速

对于矩阵快速幂,其作用能够达到快速递推公式的作用

这里先定义一个矩阵

struct martix{
    int x[105][105];
    martix(){memset(x,0,sizeof x);}
};

首先看如何进行矩阵计算,由线性代数知:

martix cacl(martix a,martix b){
    martix c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                c.x[i][j]=(c.x[i][j]%mod+a.x[i][k]%mod*b.x[k][j]%mod)%mod;
    return c;
}

那么如何快速求出 $k$ 个矩阵的相乘呢? 我们可以回忆数字的快速幂,普通的快速幂是把 $k$ 化成二进制,即

int qpow(int a,int k){
    int res=1;;
    while(k){
        if(k&1) res*=a,res%=mod;
        k>>=1,a*=a,a%=mod;
    }
    return res;
}

阵快速幂与其类似,也就把次方数进行二进制计算

martix qpow(martix mp,int k){
    martix res;
    for(int i=1;i<=n;i++) res.x[i][i]=1;
    while(k){
        if(k&1) res=cacl(mp,res);
        k>>=1,mp=cacl(mp,mp);
    }
    return res;
}

模板:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
int n,k;
struct martix{
    int x[105][105];
    martix(){memset(x,0,sizeof x);}
};
martix cacl(martix a,martix b){
    martix c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                c.x[i][j]=(c.x[i][j]%mod+a.x[i][k]%mod*b.x[k][j]%mod)%mod;
    return c;
}
martix qpow(martix mp,int k){
    martix res;
    for(int i=1;i<=n;i++) res.x[i][i]=1;
    while(k){
        if(k&1) res=cacl(mp,res);
        k>>=1,mp=cacl(mp,mp);
    }
    return res;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>k;
    martix mp;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) cin>>mp.x[i][j];
    martix res=qpow(mp,k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++) cout<<res.x[i][j]%mod<<' ';
        cout<<endl;
    }
    return 0;
}

矩阵快速幂的应用: 【朝夕的ACM笔记】杂项-矩阵快速幂 - 知乎 (zhihu.com)

 

标签:martix,int,res,矩阵,mp,快速
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18050422

相关文章

  • 在嵌入式设备中用多项式快速计算三角函数和方根
    惯性传感器的倾角计算要用到三角函数.在MCS-51,CortexM0,M3之类的芯片上编程时,能使用的资源是非常有限,通常只有两位数KB的Flash,个位数KB的RAM.如果要使用三角函数和开方就要引入math.h,会消耗掉10KB以上的Flash空间.在很多情况下受硬件资源限制无法使用math.h,......
  • 最大字段和,区间矩阵
    最大字段和原题链接:P1115最大子段和-洛谷|计算机科学教育新生态(luogu.com.cn)解析:经典动态规划:最大子数组问题-知乎(zhihu.com)我写的代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],dp[N]......
  • 使用官方镜像快速部署 Gitlab
    之前已经发布过一篇使用docker-compose部署Gitlab的博客,使用的是国外的某位大佬制作的镜像。博客地址为:https://www.cnblogs.com/studyjobs/p/18015154.html本篇博客使用docker-compose采用官网提供的镜像部署Gitlab,部署过程非常简单无论采用哪种方式部署Gitlab,需要的......
  • CVPR 2024 满分论文!Meta提出EfficientSAM:快速分割一切!
    前言 Meta研究者提出了一种改进思路,利用SAM的掩码图像预训练(SAMI)。这是通过利用MAE预训练方法和SAM模型实现的,以获得高质量的预训练ViT编码器。这一方法降低了SAM的复杂性,同时能够保持良好的性能。本文转载自机器之心仅用于学术分享,若侵权请联系删除欢迎关注公......
  • 邻接矩阵 存储图
    存储图可以用邻接表和邻接矩阵以下代码来自https://www.acwing.com/blog/content/405///对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点inth[N],e[N],ne[N],idx,w[N];//添加一条边a->b,权重是wvoidadd(inta,intb,intw){e[id......
  • P1874 快速求和 题解
    updon2023/12/22:修改了代码,现已通过所有hack数据。首先定义状态:令\(dp_{i,j}\)表示前\(i\)个数字要变成\(j\)所需要的最少加号个数。同时,我们还需要一个辅助数组:令\(num_{i,j}\)表示\(i\simj\)的数字组成的数(不添加加号)。然后进行转移。显然可以枚举......
  • Redis快速入门
    1、什么是Redis远程字典服务器:一个开源的基于内存的数据库,常用作键值存储,缓存和消息队列等Redis通常将全部数据存储在内存中,也可以不时的将数据写入硬盘实现持久化,但仅用于重新启动后将数据加载回内存(内存的速度比硬盘快一个数量级)基于key-value键值对的非关系型数据库......
  • 快速排序
    1.概念快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。2.基本思想快速排序的基本思想:通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对左右两个子序列继......
  • 矩阵爆破逆向之条件断点的妙用
    不知道你是否使用过IDA的条件断点呢?在IDA进阶使用中,它的很多功能都有大作用,比如:ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大,配合IDA-python的输出语句能够大杀特杀!那么本文就介绍一下这个功能点,使用z3来秒解题目。条件断点什么是条件断点呢?条件断点(ConditionalBrea......
  • 接口写完想快速压力测试?试试Apipost一键压测功能
    背景研发同学在调试完成某些接口后需要验证一下高并发情况下的接口运行情况。这时候必须得跟测试同学协调一下,但这来来回回也有点麻烦,而实际上,这个工作量并不算太大。所以Apipost也是推出了一键压测功能来解决这个痛点场景。这篇文章给大家介绍Apipost的一键压测功能。使用方法......