博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯 算法训练 矩阵乘方(矩阵快速幂取模)
阅读量:4139 次
发布时间:2019-05-25

本文共 1138 字,大约阅读时间需要 3 分钟。

  算法训练 矩阵乘方  
时间限制: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
#include 
#include
using namespace std;const int N=2;int m;struct Matrix{ int m[N][N];}matrix;Matrix I={1,0, 0,1};Matrix p;inline Matrix multiply(Matrix a,Matrix b){ int i,j,k; Matrix re; for(i=0;i
0){ if(n&1){ b=multiply(b,re); } n=n>>1; re=multiply(re,re); } return b;}int main(){ int b; while(cin>>b>>m){ for(int i=0;i<2;i++) for(int j=0;j<2;j++) cin>>p.m[i][j]; matrix=quick_pow(b); for(int i=0;i<2;i++){ for(int j=0;j<2;j++) cout<
<<" "; //坑 如果m=1且输出单位矩阵就要mod成0 cout<
 

转载地址:http://zbmvi.baihongyu.com/

你可能感兴趣的文章
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>
SQL1015N The database is in an inconsistent state. SQLSTATE=55025
查看>>
RQP-DEF-0177
查看>>
Linux查看mac地址
查看>>
Linux修改ip
查看>>
MySQL字段类型的选择与MySQL的查询效率
查看>>
Java的Properties配置文件用法【续】
查看>>
JAVA操作properties文件的代码实例
查看>>
IPS开发手记【一】
查看>>
Java通用字符处理类
查看>>
文件上传时生成“日期+随机数”式文件名前缀的Java代码
查看>>
Java代码检查工具Checkstyle常见输出结果
查看>>
北京十大情人分手圣地
查看>>
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>