蓝桥杯基础练习---矩阵乘法

基础练习 矩阵乘法

时间限制:1.0s   内存限制:512.0MB

锦囊1

锦囊2

锦囊3

问题描述

  给定一个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 20

hint:就是输入一个矩阵,让你求它的 n 次幂,一个数的快速幂知道了原理的话好像也不容易忘记了呢。。。矩阵的话,这个题目其实不需要快速幂可以做,但是快速幂的做法好像高大上一点? 做这个题目还是有收获有收获!!!

就是用向量的方式定义矩阵 typedef vector<vector<int> > mat  ;  可以用 mat a(n, vector<int>(m))的方式定义一个n * m的矩阵,然后矩阵乘法的话就是一个三重循环就好了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<vector>
 6 using namespace std;
 7 typedef vector<int> v;
 8 typedef vector<v>mat;
 9 int n, m;
10
11
12 //。。。以前做过的题目,现在又差不多忘光了吧。。。主要是忘记了vector的用法
13 //vector还是要好好学一学, vector<int> v 定义一个叫v的存储整型的向量,用vector定义二维数组(矩阵的方法) vector<v> mat;
14 //若要在定义一个向量矩阵的时候给它分配指定的空间大小的话,用 vector<vector<int> >mat(n, vector<int>(m)) 则行为n,列为m
15
16 mat MAT(mat &a, mat &b){
17     mat c(a.size(), v(b[0].size()));
18     //c.resize(n);
19     for(int i=0; i<n; i++){
20         for(int j=0; j<n; j++){
21             c[i][j]=0;
22         }
23     }
24     for(int i=0; i<n; i++){
25         for(int j=0; j<n; j++){
26             for(int k=0; k<n; k++){
27                 c[i][j] += a[i][k] * b[k][j];
28             }
29         }
30     }
31     return c;
32 }
33 mat MATRIX(mat a, int b){
34     mat ans(n, v(n));
35     for(int i=0; i<n; i++){
36         ans[i][i] = 1;
37     }
38     while(b>0){
39         if(b&1) ans = MAT(ans, a);
40         a = MAT(a, a);
41         b >>= 1;
42     }
43     return ans;
44 }
45 int main(){
46     cin >> n >> m;
47     mat a(n, v(n));
48     mat ans(n, v(n));
49     for(int i = 0; i < n; i++){
50         for(int j = 0; j < n; j++){
51             int x;
52             cin >> x;
53             a[i][j] = x;
54         }
55     }
56     ans = MATRIX(a, m);
57     for(int i=0; i<n; i++){
58         for(int j=0; j<n; j++){
59             cout << ans[i][j] << " ";
60         }
61         cout << endl;
62     }
63     return 0;
64 }
时间: 2024-10-11 04:22:42

蓝桥杯基础练习---矩阵乘法的相关文章

蓝桥杯- 算法训练 矩阵乘法

算法训练 矩阵乘法 时间限制:1.0s   内存限制:512.0MB 问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j). 接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j). 输出格式 m行,每行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值. 样例输入 2 3 21 0 -11 1 -30 31 23 1 样例输出 -3 2-8

蓝桥杯 BASIC 27 矩阵乘法(矩阵、二维数组)

[思路]:注意0次幂是单位矩阵. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip> #include <cstdio> #include <cstring> using namespace std; #define MAX 30+2 void cal(int m[MAX][MAX], int t[MAX][MAX], int r[MAX][MAX], int N

蓝桥杯——基础练习之分治法_快速排序

分治法,分而治之,基本思路:分,解,和. 初探分治之快速排序. public class _DividedConquer { static int[] iarr; public static void main(String[] args) { // TODO Auto-generated method stub iarr=new int[]{6,4,5,3,1,2}; quick(0, iarr.length-1); for(int i:iarr) { System.out.print(i+"

蓝桥杯——基础练习之FJ的字符串

问题描述 FJ在沙盘上写了这样一些字符串: A1 = "A" A2 = "ABA" A3 = "ABACABA" A4 = "ABACABADABACABA" - - 你能找出其中的规律并写所有的数列AN吗? 输入格式 仅有一个数:N ≤ 26. 输出格式 请输出相应的字符串AN,以一个换行符结束.输出中不得含有多余的空格或换行.回车符. 样例输入 3 样例输出 ABACABA public static void main(

蓝桥杯—— 基础练习之Sine之舞

问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力. 不妨设 An=sin(1–sin(2+sin(3–sin(4+...sin(n))...) Sn=(...(A1+n)A2+n-1)A3+...+2)An+1 FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题. 输入格式 仅有一个数:N<201. 输出格式 请输出相应

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

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

蓝桥基础练习 矩阵乘法 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 21 23 4 样例输出 7 1015 22 解:矩阵乘法满足结合律,所以也可以用快

蓝桥杯-基础练习-十六进制转八进制(被超时了!!!)

基础练习 十六进制转八进制 时间限制:1.0s   内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000. 输出格式 输出n行,每行为输入对应的八进制正整数. 注意 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0. 样例输入 2 39 123ABC 样

1571:基础练习 矩阵乘法

题目:https://acmore.cc/problem/LOCAL/1571#desc 解法一:二维数组(因为二维数组不能作为函数的返回值,所以处理起来比较麻烦,此时推荐使用vector表示二维数组,请看解法二) 1 #include <iostream> 2 3 using namespace std; 4 5 int a[30][30] = { 0 }; //初始矩阵 6 int b[30][30] = { 0 }; //结果矩阵 7 8 int getMultiSum(int a1[]