蓝桥杯 算法训练 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)复数之间 ...
随机推荐
- PAT1073. Scientific Notation (20)
#include <iostream> using namespace std; string a; int expo; int dotPos; int expoPos; int i; i ...
- maven项目Dao层优化
平时我们习惯一个实体类就对应一个dao类,这样做,增删改查都大同小异,只是实体类对象不一样而已,因此,我们可以把公用的方法抽取来,建立一个IBaseDao接口,如下: public interface ...
- MYSQL 多实例运行
1.创建数据文件 mkdir /var/lib/mysql_3307 mysql_install_db --datadir=/var/lib/mysql_3307 --user=mysql 2.给数据 ...
- Git迁移 从SVN到Git
Migrating from SVN to Git 首先我们需要在Stach或者GitHub上新建一个Repository, 拿到它的URL. 接下来参照如下步骤 : At first we shou ...
- OWIN初探
什么是 OWIN ? OWIN 的全称是 "Open Web Interface for .NET", OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一 ...
- html5适应屏幕的方案
适应屏幕的方案: 1.css3 Media queries (针对多版本设计稿) 2.设计稿不复杂的时候 通过宽度自适应用百分比 3.通过更新meta:viewport标签,通过设计稿尺寸 ...
- [转载]java调用PageOffice生成word
一.在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jac ...
- LeetCode OJ:Merge Two Sorted Lists(合并两个链表)
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- Activity传递参数——传递简单数据
一.新建一个空的工程 二.在主界面中添加一个按钮 三.新建一个空的activity,并命名为TheAty 四.修改MainActivity.java中的onCreate函数 protected voi ...
- 嵌入式中 ARM的几种工作模式 以及异常模式的优先级
一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr) 用于正常执行程序 2. 快速中断模式(FIQ) 用于高速数据传输 3. 外部中断模 ...