蓝桥杯 算法训练 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)复数之间 ...
随机推荐
- hdu1596 find the safest road - floyd
2017-08-04 14:42:56 writer:pprp 题意: Problem Description XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每 ...
- SQL编码规范
1 目的 为了保证所每个项目组编写出的程序都符合相同的规范,便于理解和维护,便于检查.减少出错概率,有助于成员间交流,保证一致性.统一性而建立的SQL程序编码规范. 2 范 ...
- 浅谈 django Models中的跨表
跨表操作在数据库操作非常常用,虽然其会降低读取数据的性能,但是它能节约数据在硬盘中的占用,优化数据表的结构和各自之间的关系. 在sql中,一般跨表需要用到 join 关键字 select * from ...
- 如何将Django部署到Apache服务器上
操作环境: Ubuntu 16.04 Apache 2.4 Django 1.9 Python 2.7 mod_wsgi 前言:本教程纯自己查阅资料后整理,望对大家有帮助! 1. 安装 mod_ws ...
- 用WebClient在异步下载或上传时每次只进行一个任务 C#
当在每次上传或者下载的时候,我只想进行一个任务的,我用的是WebClient类,但是我又不想用同步的方法UploadFile.DownloadFile,因为WebClient这个类的同步方法没有Upl ...
- C++(二十) — 指针常量和常量指针
1.const 常量概念 对于 const 定义的常量,必须在定义时初始化,不能在程序执行运行过程中改变. 2.指针常量.常量指针 区别 (1)技巧:从右向左读,替代方法: p:换为 p is a: ...
- app与后台的token、sessionId、RSA加密登录认证与安全解决方案
一.登录机制 粗略地分析, 登录机制主要分为登录验证.登录保持.登出三个部分.登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确认. 登录认保持是指客户 ...
- UVALive 4270 Discrete Square Roots
题目描述: 在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根. 在模n意义下,非负整数x的离散平方根是满足0<=r<n且r2=x(mod n)的整数r. 解题思路: ...
- 条款25:考虑写出一个不抛出异常的swap函数
首先说下标准库的swap算法: namespace std{ template<typename T> void swap(T & a, T & b) { T tmp = ...
- 大马猴队-Alpha阶段项目复审
队名 优点 缺点 名次 菜鸡互坑队 经典游戏,情怀加分. 刷新的苹果会在蛇身上出现 14 菜鸡互啄 利用python语言实现git版本管理,典型用户清晰. 没有很好地分析用户痛点,没有测试计划 4 ...