首页 > 其他分享 >P3390 【模板】矩阵快速幂

P3390 【模板】矩阵快速幂

时间:2024-12-25 21:53:27浏览次数:7  
标签:le const Matrix int 矩阵 P3390 模板

P3390 【模板】矩阵快速幂

本来想学动态dp 然后被一路 递归 到了这里。

首先我们要知道矩阵乘法是什么,两个矩阵可以 \(A,B\) 可以相乘,当且仅当 \(A\) 的列数= \(B\)的行数

两个大小分别为 \(m \times n\) 和 \(n \times p\) 的矩阵 \(A, B\) 相乘的结果为一个大小为 \(m \times p\) 的矩阵。将结果矩阵记作 \(C\),则

\[c_{i j} = \sum_{k = 1}^{n} a_{i k} b_{k j} \text{,\qquad($1 \le i \le m$, $1 \le j \le p$).} \]

其实按我的理解就是将 \(A\) 的某一行 \(i\) 整体取下来然后向下旋转 90°,然后找到第 \(j\) 列,将这两个数列 按位相乘 之后求和作为 \(C_{i,j}\) 好了我知道这很不严谨 qwq

然后我们都学过快速幂对吧,直接乘就完事了

Code:

#include<bits/stdc++.h>
#define int long long
const int N=105;
const int mod=1e9+7;
using namespace std;
int n,k;
struct Matrix{
    int a[N][N];
}ANS;
Matrix operator *(const Matrix &A,const Matrix &B)
{
    Matrix res={{0}};
    for(int i=1;i<=n;i++)for(int k=1;k<=n;k++)for(int j=1;j<=n;j++)
    {
        res.a[i][j]+=A.a[i][k]*B.a[k][j];
        res.a[i][j]%=mod;
    }
    return res;
}
Matrix qpow(Matrix x,int k)
{
    Matrix K=x;
    if(k<0){for(int i=1;i<=n;i++)x.a[i][i]=1;return x;}
    while(k)
    {
        if(k&1)
        {
            x=x*K;
        }
        K=K*K;
        k>>=1;
    }
    return x;
}
void work()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
    {
        scanf("%lld",&ANS.a[i][j]);
    }
    //cout<<n<<" "<<k<<"\n";
    //return ;
    if(k)
    ANS=qpow(ANS,k-1);
    else
    {
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
        {
            cout<<(i==j ? 1 : 0)<<(j==n ? "\n" : " ");
        }
        return ;
        
    }
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
    {
        printf("%lld",ANS.a[i][j]);
        printf(j==n ? "\n" : " ");
    }
}
#undef int
int main()
{
    //freopen("P3390_1.in","r",stdin);freopen("P3390.out","w",stdout);
    work();
    return 0;
}

标签:le,const,Matrix,int,矩阵,P3390,模板
From: https://www.cnblogs.com/LG017/p/18631489

相关文章

  • 大二上 数据结构与算法 课堂模板算法 20241225
    数据结构与算法1-基本数据结构2-分治策略3-堆4-排序5-选择&树6-搜索树&散列表&并查集6.1-搜索树6.2-散列表6.3-并查集intfind(intx){if(pre[x]==x)returnx;returnpre[x]=find(pre[x]);}voidjoin(intx,inty){intfx=find(x)......
  • 稀疏矩阵数据结构(如CSR、CSC格式)
    稀疏矩阵数据结构稀疏矩阵(SparseMatrix)是一种大多数元素为零的矩阵。在处理稀疏矩阵时,如果我们直接使用常规的二维数组来存储矩阵数据,将会浪费大量的存储空间,因为大部分元素都是零。为了解决这一问题,稀疏矩阵数据结构应运而生,通过只存储非零元素来大幅减少内存消耗。最常用的稀......
  • 13矩阵的逆
    1.逆矩阵的定义对于n阶矩阵A,存在一个n阶矩阵B,使:$$AB=BA=E$$则称矩阵A是可逆的。且B是A的逆矩阵,简称“逆阵”,记为:$$B=A^{-1}$$2.对逆矩阵的理解若存在矩阵$A_{n×n}$、$x_{n×1}$、$b_{n×1}$,使:$$b=Ax$$又存在矩阵$B_{n×n}$,使:$$AB=E$$则:$$Bb=ABx\\Rightar......
  • leetcode热题100(54. 螺旋矩阵)c++
    链接:54.螺旋矩阵-力扣(LeetCode)给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2......
  • 300+ Excel可视化图表模板:13种分类助你轻松制作专业图表
    正文:在职场中,专业的数据可视化能力是一项非常重要的技能。而使用高质量的Excel图表模板,可以让你的数据分析和展示工作更加高效!今天为大家推荐一份300+Excel可视化图表模板合集,涵盖13种图表分类,适用于多种办公场景。无论是数据分析、项目管理,还是日常汇报,这些模板都能帮助你快速......
  • 模板字符串
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 线段树1模板 (洛谷p3372)
    关键在于创建一个向上返回的函数up,向下查询的同时将父亲sum和add值传给儿子函数down最后用lazy函数更新sum和add的值先通过build函数是sum数组完成初始化,然后用adds已经quiey函数完成求解,详细注释见代码​#include<iostream>#include<cstdio>usingnamespacestd;intm......
  • 【深度学习基础|知识概述】基础数学和理论知识中的线性知识:矩阵与向量运算、特征值与
    【深度学习基础|知识概述】基础数学和理论知识中的线性知识:矩阵与向量运算、特征值与特征向量、张量,附代码。【深度学习基础|知识概述】基础数学和理论知识中的线性知识:矩阵与向量运算、特征值与特征向量、张量,附代码。文章目录【深度学习基础|知识概述】基础数学和理......
  • LeetCode59 螺旋矩阵2
    原理本题要求生成一个给定大小 n 的螺旋矩阵,矩阵中的元素按照螺旋顺序从1开始依次递增填充。整体思路是通过模拟螺旋的填充路径,一圈一圈地向矩阵内部填充数字,每一圈的填充过程都按照顺时针方向,依次填充上侧行、右侧列、下侧行和左侧列,直到整个矩阵被填满。对于奇数边长的......
  • 【无标题】51系列单片机学习:矩阵按键
    文章目录前言一、矩阵按键的硬件连接二、工作原理三、代码编写总结前言矩阵按键是一种通过行列交叉连接的按键阵列,可以节省单片机的IO口资源,用于实现多个按键的输入检测。以下是本文的简要介绍。一、矩阵按键的硬件连接1.将矩阵按键按照图1方式进行连接。图1.矩阵按......