蓝桥基础练习 矩阵乘法 BASIC-17(矩阵快速幂)

问题描述

  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
  例如:
  A =
  1 2
  3 4
  A的2次幂
  7 10
  15 22

输入格式

  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
  接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值

输出格式

  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开

样例输入

2 2
1 2
3 4

样例输出

7 10
15 22

解:矩阵乘法满足结合律,所以也可以用快速幂

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <cmath>
#include <map>

using namespace std;
typedef long long ll;

#define INF 0x7fffffff
const double inf=1e20;
const int maxn=1000+10;
const int mod=1e7;
const double pi=acos(-1);

const int N=40,M=40;

struct matrix{
    int n,m;
    long long a[N][M];
    matrix(){//    初始化2*2的单位矩阵
        n=m=40;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                a[i][j]=0;
            }
        }
        for(int i=0;i<n;i++){
            a[i][i]=1;
        }
    }
    void clear(int n_){
        n=m=n_;
        //memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                a[i][j]=0;
                //if(i==j)a[i][j]=1;
            }
        }
    }
    void clear1(int n_){
        n=m=n_;
        //memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                a[i][j]=0;
                if(i==j)a[i][j]=1;
            }
        }
    }
    matrix operator+(const matrix &b)const{
        matrix tmp;
        tmp.clear(b.n);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                tmp.a[i][j]=a[i][j]+b.a[i][j];
            }
        }
        return tmp;
    }
    matrix operator*(const matrix &b)const{
        matrix tmp;
        tmp.clear(b.n);
        for(int i=0;i<n;i++){
            for(int j=0;j<b.m;j++){
                for(int k=0;k<m;k++){
                    tmp.a[i][j]=((a[i][k]*b.a[k][j])+tmp.a[i][j]);
                }
            }
        }
        return tmp;
    }
};

matrix pow2(matrix A,int n){
    matrix B;
    int nn=A.n;
    B.clear1(nn);
    while(n>0){
        if(n&1)B=B*A;
        A=A*A;
        n/=2;
    }
    return B;
}

int main(){
    matrix a,b;
    int n,m;
    scanf("%d%d",&n,&m);
    a.clear1(n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%lld",&a.a[i][j]);
        }
    }
    b=pow2(a,m);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%lld ",b.a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wz-archer/p/12507570.html

时间: 2024-11-01 22:54:52

蓝桥基础练习 矩阵乘法 BASIC-17(矩阵快速幂)的相关文章

矩阵乘法 codevs 1287 矩阵乘法

1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容.当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的.小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵).(输入数据保证aj=bi,不需要判断) 矩阵乘法的定义: 1. 矩阵A乘以B的

矩阵乘法&amp;&amp;dp加速矩阵的思路(E. Wet Shark and Blocks)

There are b blocks of digits. Each one consisting of the same n digits, which are given to you in the input. Wet Shark must choose exactly one digit from each block and concatenate all of those digits together to form one large integer. For example,

【试题 基础练习 矩阵乘法】暴力矩阵乘法,再次了解一下矩阵

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例输入 2 21 23 4 样例输出 7 1015 22 import java.io.Buff

小结:矩阵乘法

概要: 在一些递推式中,我们发现好像不能在优化了(例如斐波那契数列普通递推是O(n)的),但是这个特殊的递推式我们可以用矩阵来实现O(logn)(忽略了矩阵自身计算的O(n^3)).而矩阵乘法运算是a[i, k]*b[k, j]=c[i, j],从这个式子可看出朴素是n^3的(当然那些神算法我不会),而fib数列递推式可以用矩阵乘法来表示,即 ┏ 1,1 ┓[f(n-1), f(n-2)]*┃        ┃=[f(n), f(n-1)] ┗ 1, 0 ┛ 而矩阵乘法是可以做快速幂的!也就是说

蓝桥网试题 java 基础练习 矩阵乘法

------------------------------------------------------------ 第一次感觉到好好学习的重要性QAQ 在做这道题之前请先学会 :矩阵乘法(百度百科) 矩阵的0次幂:对角线为1 其他值为0 例如 结果 ------------------------------------------------------------ 算法 1 import java.util.*; 2 public class Main { 3 public stati

AI学习之路(19)TensorFlow里的矩阵乘法

如果对矩阵的知识有点遗忘,有点陌生,有点想不起来,请先看看这个网页: http://blog.csdn.net/caimouse/article/details/55001181 基础知识已经补过了,就直接来使用TF的矩阵乘法了. tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=Non

codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数

对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些细节,比如快速幂时ans矩阵的初始化方式,快速幂的次数,矩阵乘法过程中对临时矩阵的清零,最后输出结果时的初始矩阵...矩阵快速幂好理解但是细节还是有点小坑的.. 下面就是满满的槽点,,高能慎入!!! 对于这个题目要求矩阵过程中对m取模,结果对g取模,我表示难以接受,,上来没看清题直接wa19个点,另

【C++小白成长撸】--矩阵乘法程序

矩阵乘法是大学矩阵课程中,相比矩阵加减法比较困难的部分. 矩阵乘法的原理: 矩阵乘法在代码中实现 得到目标矩阵的一个元素,涉及两个求和符号,一个求和符号一个for循环,两个求和符号两个for循环,再加上是二维数组,再加一个for循环 以下呈现出代码 1 /*程序的版权和版本声明部分: 2 **Copyright(c) 2016,电子科技大学本科生二年级学生 3 **All rights reserved. 4 **文件名:矩阵乘法 5 **程序作用:矩阵乘法 6 **作者:Amoshen 7 *

矩阵乘法&amp;&amp;矩阵快速幂&amp;&amp;最基本的矩阵模型——斐波那契数列

矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 好,很高深对吧.那我们就更加直接地理解一下矩阵的实质:二维数组 好了这个SB都会,就不解释了 同二维数组一样,矩阵是一个'纵横排列的二维数据表格',它一般是一个n*m的二维数组,其中n*m表示它有n行m列 每一位上的数可以用下标i,j来表示,形如这样一个矩阵:

矩阵乘法优化线性递推

矩阵乘法是线性代数中一块很重要的内容.矩阵乘法的定义很奇怪[1],但正是这种奇怪的性质,让矩阵乘法成为在除了线性代数和其衍生学科(还有诸如矩阵力学之类)外最广泛使用的关于矩阵变换的应用.(什么?FFT不属于矩阵变换吧...) 注: [1]: 矩阵乘法有另外的很多定义,如未说明,指的是中间不带符号的矩阵乘法,即一般矩阵乘积.另有 标量乘积(即所有数乘上一个固定的数),阿达马乘积等,没有那么诡异,但是在大多数问题的用途上也不大. 你不会矩阵乘法?没关系,下一篇会写到的 矩阵乘法的本质 矩阵乘法的本质