算法训练 矩阵乘方  
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定一个矩阵A,一个非负整数b和一个正整数m,求A的b次方除m的余数。
  其中一个nxn的矩阵除m的余数得到的仍是一个nxn的矩阵,这个矩阵的每一个元素是原矩阵对应位置上的数除m的余数。
  要计算这个问题,可以将A连乘b次,每次都对m求余,但这种方法特别慢,当b较大时无法使用。下面给出一种较快的算法(用A^b表示A的b次方):
  若b=0,则A^b%m=I%m。其中I表示单位矩阵。
  若b为偶数,则A^b%m=(A^(b/2)%m)^2%m,即先把A乘b/2次方对m求余,然后再平方后对m求余。
  若b为奇数,则A^b%m=(A^(b-1)%m)*a%m,即先求A乘b-1次方对m求余,然后再乘A后对m求余。
  这种方法速度较快,请使用这种方法计算A^b%m,其中A是一个2x2的矩阵,m不大于10000。
输入格式
  输入第一行包含两个整数b, m,第二行和第三行每行两个整数,为矩阵A。
输出格式
  输出两行,每行两个整数,表示A^b%m的值。
样例输入
2 2
1 1
0 1
样例输出
1 0
0 1
 
题目解析:
  题目中已经给出了解题思路,只需分情况讨论 b 为不同情况时,矩阵该怎样去乘即可。
  因为C/C++中无法返回二维数组,所以给出两种代码,一种是常规方式,一种为结构体,但思路如题所示。后者较前者的时间复杂度更高,但空间复杂度大致相同。
 
示例代码1:

 #include<iostream>
#include<memory.h>
using namespace std; #define MAX_NUM 2 //数组copy 将源数组s复制给目的数组o
void arrcopy(int s[][MAX_NUM], int o[][MAX_NUM])
{
for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
o[i][j] = s[i][j];
}
}
} /*
矩阵乘法
m:模
*/
void matrixMul(int x[][MAX_NUM], int y[][MAX_NUM], int m)
{
int t[MAX_NUM][MAX_NUM];
memset(t, , sizeof(t)); for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
for (int k = ; k < MAX_NUM; k++)
{
t[i][j] += x[i][k] * y[k][j];
t[i][j] %= m;
}
}
} arrcopy(t , x); //最终结果保存在数组x
} //分情况处理
void dispose(int A[][MAX_NUM], int b, int m)
{
if (b == )
{
int tmp;
for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
if (i == j)
tmp = ;
else
tmp = ;
A[i][j] = tmp % m; //A为单位矩阵 A^b%m=I%m
}
}
return;
} if (b % == ) //A^b%m=(A^(b/2)%m)^2%m
{
dispose(A, b / , m);
matrixMul(A, A, m);
}
else //A^b%m=(A^(b-1)%m)*a%m
{
int t[MAX_NUM][MAX_NUM];
arrcopy(A , t);
dispose(A, b - , m);
matrixMul(A, t, m);
}
} int main()
{
int b, m;
scanf("%d%d", &b, &m); int A[MAX_NUM][MAX_NUM];
for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
scanf("%d", &A[i][j]);
}
} dispose(A, b, m); for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
printf("%d ", A[i][j] % m);
}
printf("\n");
} return ;
}

示例代码2:

 #include<iostream>
using namespace std; #define MAX_NUM 2 struct Matrix
{
int arr[MAX_NUM][MAX_NUM];
}; Matrix A; //矩阵乘法,与m取模,返回结果
Matrix mul(Matrix x, Matrix y, int m)
{
Matrix t;
for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
t.arr[i][j] = ;
for (int k = ; k < MAX_NUM; k++)
{
t.arr[i][j] += x.arr[i][k] * y.arr[k][j];
t.arr[i][j] %= m;
}
}
}
return t;
} //分情况处理
Matrix dispose(Matrix A, int b, int m)
{
if (b == )
{
for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
if (i == j)
A.arr[i][j] = % m;
else
A.arr[i][j] = % m;
}
}
return A;
} Matrix t = dispose(A, b / , m);
if (b % == )
return mul(t, t, m);
else //当b为奇数时,先计算A^(b/2)次方,再乘以A,即A^(b-1)*A
//例如,b=5,b/2=2,即A^5 = (A^2 * A^2) * A
return mul(mul(t, t, m), A, m);
} int main()
{
int b, m;
scanf("%d%d", &b, &m); for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
scanf("%d", &A.arr[i][j]);
}
} Matrix p = dispose(A, b, m); for (int i = ; i < MAX_NUM; i++)
{
for (int j = ; j < MAX_NUM; j++)
{
printf("%d ", p.arr[i][j]);
}
printf("\n");
} return ;
}

蓝桥杯 算法训练 ALGO-60 矩阵乘法的更多相关文章

  1. Java实现 蓝桥杯 算法训练 矩阵乘法

    算法训练 矩阵乘法 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 输入两个矩阵,分别是ms,sn大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均 ...

  2. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  3. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  4. java实现 蓝桥杯 算法训练 Password Suspects

    问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...

  5. 蓝桥杯算法训练<一>

    一.图形显示 此题虽然简单,但是需啊哟注意的是,每个“*”后边有一个空格] 问题描述 编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数): * * * * * * * * ...

  6. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  7. 蓝桥杯 算法训练 ALGO-34 纪念品分组

    算法训练 纪念品分组   时间限制:1.0s   内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购 ...

  8. 蓝桥杯 算法训练 ALGO-36 传纸条

    算法训练 传纸条   时间限制:1.0s   内存限制:512.0MB 问题描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而 ...

  9. 蓝桥杯 算法训练 ALGO-142 P1103

    算法训练 P1103   时间限制:1.0s   内存限制:256.0MB 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间 ...

随机推荐

  1. 从reduce函数说起...

    reduce函数:  方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值, 最终返回的要看函数内部return的内容. 1. 累加器: var ar ...

  2. DevExpress组件之——TreeList组件

    由于是第一次接触到第三方控件DevExpress中的TreeList,对其进行了进一步的研究,采用递归算法实现.做下自己熟悉第三方控件的整个过程,为和我一样处理于起步阶段的同仁们提供个参考,以下为最终 ...

  3. Action<T>和Func<T>

    Action<T>和Func<T>都是泛型委托. Action<T>表示委托可以引用一个viod返回类型的方法,至于方法是带几个参数,什么类型的参数,由后面的泛型决 ...

  4. 编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad。

    package IO; import java.io.*; public class FileCopy { public static void main(String[] args) throws ...

  5. vim 中的常用编辑

    1.将1到3列行首添加‘#’ :1,3s/^/#/g 2.将1到3列行首去除‘#’ :1,3s/^#//g 3.将1到3列中前两列字符去掉 :1,3s/^..//g 4.将1到3列中行末前两个字符去掉 ...

  6. python学习笔记(接口自动化框架 V2.0)

    这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...

  7. web自动化中的page object模式

    一. 原理 将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离 类的属性:元素定位 类的行为:元素的操作 测试用例:调用所需页面对象中的行为,组成测试用例 二. 好处 1. 当 ...

  8. 六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode("utf-8")将字节转化成字符串 ...

  9. linux rpm命令安装卸载 初步使用

    安装(以安装jdk为例) 1.下载后,首先把jdk-7u3-linux-x64.rpm复制到/usr/local/src#cp jdk-7u3-linux-x64.rpm /usr/local/src ...

  10. <img>边框的border属性

    默认地,图像是没有边框的(除非图像在 a 元素内部). 浏览器通常会把代表超链接的图像(例如包含在 <a> 标签中的图像)显示在两个像素宽的边框里面,以表示读者可以通过选择这个图像来访问相 ...