蓝桥杯 算法训练 ALGO-60 矩阵乘法
其中一个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。
1 1
0 1
0 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 矩阵乘法的更多相关文章
- Java实现 蓝桥杯 算法训练 矩阵乘法
算法训练 矩阵乘法 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 输入两个矩阵,分别是ms,sn大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均 ...
- Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...
- java实现 蓝桥杯 算法训练 Password Suspects
问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...
- 蓝桥杯算法训练<一>
一.图形显示 此题虽然简单,但是需啊哟注意的是,每个“*”后边有一个空格] 问题描述 编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数): * * * * * * * * ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- 蓝桥杯 算法训练 ALGO-34 纪念品分组
算法训练 纪念品分组 时间限制:1.0s 内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购 ...
- 蓝桥杯 算法训练 ALGO-36 传纸条
算法训练 传纸条 时间限制:1.0s 内存限制:512.0MB 问题描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而 ...
- 蓝桥杯 算法训练 ALGO-142 P1103
算法训练 P1103 时间限制:1.0s 内存限制:256.0MB 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间 ...
随机推荐
- mssqlserver,mysql,oracle分页查询
分页查询语句是sql语句编程中很长见的一个典型应用,用sql语句来分页比一些分页控件的速度要快,所以sql语句的分页在实际编程应用中还是非常广泛的. 今天给大家分享几条不同数据库编程用的分页查询语句. ...
- html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
直接使用编程软件提供的方法: 1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开My ...
- scala学习手记17 - 容器和类型推断
关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...
- scala学习手记8 - 自适应的默认做法
scala有一些默认做法,会让代码更简洁.更易读写,下面列出了这样几个特性: 1. 支持脚本.scala支持脚本,因此无须将所有的代码都放到类里.如果脚本可以满足需求,就将代码放到一个脚本里,无须再创 ...
- Spring简洁版总结
一:为什么使用spring? spring泉眼,最好的水,在企业开发中,是业务层最好的框架 spring优点是什么? 1.低侵入,低耦合 2.方便集成其他框架 3.降低javaee开发难度 4.spr ...
- docker之DockerSwarm的了解
这次一起了解下docker Swarm,什么是dockerSwarm. 什么是docker Swarm 产品背景 使用docker的流程,ssh到一台服务器,运行docker命令来运行本机的docke ...
- BCCoventUtils全角与半角互相转换
public class BCConvert { /** * ASCII表中可见字符从!开始,偏移位值为33(Decimal) */ static final char DBC_CHAR_START ...
- MYSQL变量和状态
mysql设置变量是在my.cnf文件里,修改配置文件后需要重启mysql的服务,才能生效.但是在线上服务器是不允许随便重启的,我们可以用命令直接修改变量值,使其生效.然后再修改配置文件中的值,以防止 ...
- Apache Samza流处理框架介绍——kafka+LevelDB的Key/Value数据库来存储历史消息+?
转自:http://www.infoq.com/cn/news/2015/02/apache-samza-top-project Apache Samza是一个开源.分布式的流处理框架,它使用开源分布 ...
- cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
四.副本存储 Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中. Cassandra有三种副本配置策略: 1) SimpleStrategy (Rac ...