算法提高 矩阵乘方

时间限制: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为偶数,则Ab%m=(A(b/2)%m)^2%m,即先把A乘b/2次方对m求余,然后再平方后对m求余。

  若b为奇数,则Ab%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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class 矩阵乘方算法提高 {
static int m=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int b = Integer.parseInt(str[0]);
m = Integer.parseInt(str[1]);
int[][] resultMatrix=new int[2][2];
int[][] matrix=new int[2][2];
for(int i=0;i<2;i++){
String[] tag=br.readLine().split(" ");
for(int j=0;j<2;j++){
matrix[i][j]=Integer.parseInt(tag[j]);
}
}
resultMatrix=powMul(matrix, b);
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
System.out.print(resultMatrix[i][j]%m+" ");
}
System.out.println();
}
} private static int[][] mul(int[][] x,int[][] y){
int[][] temp=new int[2][2];
for(int a=0;a<2;a++){
for(int b=0;b<2;b++){
for(int c=0;c<2;c++){
temp[a][b]+=x[a][c]*y[c][b];
temp[a][b]%=m;
}
}
}
return temp;
} private static int[][] powMul(int[][] arr,int b){
if(b==0){
int[][] temp=new int[2][2];
for(int i=0;i<2;i++){
temp[i][i]=1;
}
return temp;
}if(b==1){
return arr;
}
int[][] rep=powMul(arr,b/2);
if(b%2==0){
return mul(rep,rep);
}else{
return mul(mul(rep,rep),arr);
}
} }

Java实现 蓝桥杯VIP 算法训练 矩阵乘方的更多相关文章

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

    import java.util.Scanner; public class 矩阵乘方 { public static void main(String[] args) { Scanner scann ...

  2. Java实现 蓝桥杯VIP 算法训练 矩阵加法

    时间限制:1.0s 内存限制:512.0MB 问题描述 给定两个N×M的矩阵,计算其和.其中: N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000. 输入格式 输入数据的第一行包含两个整 ...

  3. Java实现蓝桥杯VIP 算法训练 找公倍数

    问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题目要求的输入范例. 样例输出 与上面的样例输入对应的输出. 这道题其实没有什么可写的,但是为了让读者更方便的 ...

  4. Java实现 蓝桥杯VIP 算法训练 无权最长链

    试题 算法训练 无权最长链 问题描述 给定一个n节点m边的无圈且连通的图,求直径 输入格式 第一行两个数字n,m 接下来m行每行两个数字x,y,代表x,y之间有一条边 输出格式 要求用户的输出满足的格 ...

  5. Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)

    试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...

  6. Java实现 蓝桥杯VIP 算法训练 星际交流

    算法训练 星际交流 时间限制:1.0s 内存限制:256.0MB 问题描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...

  7. Java实现 蓝桥杯VIP 算法训练 Car的旅行路线

    大家可以看一下这个,蓝桥杯官网的这道题是有问题的 Car的旅行路线 算法训练 Car的旅行路线 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 查看参考代码 问题描述 又到暑假 ...

  8. Java实现 蓝桥杯VIP 算法训练 暗恋

    算法训练 暗恋 时间限制:1.0s 内存限制:256.0MB 问题描述 同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事.暗恋,是他唯一能做的事.他只能在每天课间操的时候,望望她的位置 ...

  9. Java实现蓝桥杯VIP算法训练 最大获利

    试题 算法训练 最大获利 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Chakra是一位年轻有为的企业家,最近他在进军餐饮行业.他在各地开拓市场,共买下了N个饭店.在初期的市场调 ...

随机推荐

  1. Hexo 博客利用 Nginx 实现中英文切换

    本文记录了对 Hexo 博客进行中英文切换的配置过程,实现同一应用共用模版,任何页面可以切换到另一语言的对应页面,并对未明确语言的访问地址,根据浏览器语言进行自动跳转 实现细则 中英文地址区分 博客中 ...

  2. [hdu5218]DP-约瑟夫环变形

    题意:n个人围成一圈,另外一个人最开始站在第一个人前面,每次从集合s里面随机选一个数x,这个人顺时针经过x个人后停下来,当前位置的前一个人出队,然后继续进行,求最后剩下的那个人的可能编号. 思路:由于 ...

  3. hdoj 1874 dijkstra

    在做PAT的甲1003,思考DFS和图什么的,时间紧张直接去看柳神(日后上传柳神的C++版本)的订阅,得知是dijkstra,转去用hdoj 1874练手,写了两天,终于调出来了 题目链接:http: ...

  4. 格式转换工具:使用kgEncode转换压缩无损音乐

    在kugou安装目录下,有kgEncode目录,可以在各种格式中相互转换

  5. Python之sys.arg[]的用法解释

    转载自:https://www.cnblogs.com/liangmingshen/p/8906148.html sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那 ...

  6. 【Leetcode】164. Maximum Gap 【基数排序】

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  7. js中的小案例(一)

    效果图: html代码: <div id="date"> <p> <span id="prev">上一月</span& ...

  8. 【雕爷学编程】Arduino动手做(6)---声音传感器模块

    37款传感器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做实验 ...

  9. Reflux之Action

    reflux在flux的基础上,去掉了dispatcher. 在Reflux中,每一个Action本身就是一个Publisher(消息发布者),具有消息发布功能:而每一个Store除了作为数据存储之外 ...

  10. 汉语分词工具包jieba

    #分词pip install jieba import jieba str="你真的真不知道我是谁吗?" res1=jieba.cut(str) print(list(res1)) ...