藍橋杯 演算法訓練 ALGO 60 矩陣乘法

2022-06-24 03:15:08 字數 2662 閱讀 6119

演算法訓練 矩陣乘方  

時間限制: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 21 1

0 1樣例輸出

1 00 1

題目解析:

題目中已經給出了解題思路,只需分情況討論 b 為不同情況時,矩陣該怎樣去乘即可。

因為c/c++中無法返回二維陣列,所以給出兩種**,一種是常規方式,一種為結構體,但思路如題所示。後者較前者的時間複雜度更高,但空間複雜度大致相同。

示例**1:

1 #include2 #include3

using

namespace

std;45

#define max_num 267

//陣列copy 將源陣列s複製給目的陣列o

8void arrcopy(int s[max_num], int

o[max_num])

9 16}

17}1819

/*20

矩陣乘法

21m:模

22*/

23void matrixmul(int x[max_num], int y[max_num], int

m)2437}

38}3940 arrcopy(t , x); //

最終結果儲存在陣列x 41}

4243

//分情況處理

44void dispose(int a[max_num], int b, int

m)4559}

60return;61

}6263if (b % 2 == 0) //

a^b%m=(a^(b/2)%m)^2%m

6468

else

//a^b%m=(a^(b-1)%m)*a%m

6975}76

77int

main()

78 89}

9091

dispose(a, b, m);

9293

for (int i = 0; i < max_num; i++)

9499 printf("\n"

);

100}

101102

return0;

103 }

示例**2:

1 #include2

using

namespace

std;34

#define max_num 256

struct

matrix7;

1011

matrix a;

1213

//矩陣乘法,與m取模,返回結果

14 matrix mul(matrix x, matrix y, int

m)1527}

28}29return

t;30}31

32//

分情況處理

33 matrix dispose(matrix a, int b, int

m)34

46}47return

a;48}49

50 matrix t = dispose(a, b / 2

, m);

51if (b % 2 == 0)52

return

mul(t, t, m);

53else

//當b為奇數時,先計算a^(b/2)次方,再乘以a,即a^(b-1)*a

54//

例如,b=5,b/2=2,即a^5 = (a^2 * a^2) * a

55return

mul(mul(t, t, m), a, m);56}

5758

intmain()

59 69}

7071 matrix p =dispose(a, b, m);

7273

for (int i = 0; i < max_num; i++)

7479 printf("\n"

);80}81

82return0;

83 }

題目 藍橋杯ALGO 60 矩陣乘方

一 題目 1 題目鏈結 需要登入且需要 vip 賬戶 2 問題描述 給定乙個矩陣 a,乙個非負整數 b 和乙個正整數 m,求 a 的 b 次方除 m 的餘數。其中乙個 n x n 的矩陣除 m 的餘數得到的仍是乙個 n x n 的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個...

藍橋杯 ALGO 86 演算法訓練 矩陣乘法

問題描述 輸入兩個矩陣,分別是m s,s n大小。輸出兩個矩陣相乘的結果。輸入格式 第一行,空格隔開的三個正整數m,s,n 均不超過200 接下來m行,每行s個空格隔開的整數,表示矩陣a i,j 接下來s行,每行n個空格隔開的整數,表示矩陣b i,j 輸出格式 m行,每行n個空格隔開的整數,輸出相乘...

藍橋杯 ALGO 86 演算法訓練 矩陣乘法

問題描述 輸入兩個矩陣,分別是m s,s n大小。輸出兩個矩陣相乘的結果。輸入格式 第一行,空格隔開的三個正整數m,s,n 均不超過200 接下來m行,每行s個空格隔開的整數,表示矩陣a i,j 接下來s行,每行n個空格隔開的整數,表示矩陣b i,j 輸出格式 m行,每行n個空格隔開的整數,輸出相乘...