題目 藍橋杯ALGO 60 矩陣乘方

2022-04-30 19:24:13 字數 2458 閱讀 7147

一、題目

1、題目鏈結

(需要登入且需要 vip 賬戶)

2、問題描述

給定乙個矩陣 a,乙個非負整數 b 和乙個正整數 m,求 a 的 b 次方除 m 的餘數。

其中乙個 n x n 的矩陣除 m 的餘數得到的仍是乙個 n x n 的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除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 是乙個 2 x 2 的矩陣,m 不大於 10000。

3、輸入格式

輸入第一行包含兩個整數 b, m,第二行和第三行每行兩個整數,為矩陣 a。

4、輸出格式

輸出兩行,每行兩個整數,表示 a ^ b % m 的值。

5、樣例輸入

2 21 1

0 16、樣例輸出

1 00 1

二、分析與思路

有點意思的一道基礎題。

首先這是個矩陣乘法問題,結合線性代數的知識,不難理解這個過程,並且這道題的矩陣限定為 2 * 2,就更簡單了。題面給出了較快的演算法,然而我完全沒 get 到它想表達的,於是真就直接對 b 判斷一次奇偶再分別處理,可能是藍橋杯 oj 裡的 sb 題太多了,以為這道題也很 sb,交了一發輕鬆爆 0。

大致看了下其他的部落格,重新讀了遍題,才意識到題面所謂的較快方法 —— 原來是在暗示快速冪。。甚至可以說是明示。題目那兩句話本質是隱含了遞迴思想的,確實之前沒做過矩陣快速冪,完全沒有往這方面想。

那麼明白了需要快速冪之後,其實矩不矩陣是沒啥影響的,把矩陣的乘法運算封裝一下,和普通的快速冪是幾乎一樣的。

三、**

1、常規**

1 #include 2

using

namespace

std;

34 typedef long

long

ll;5

6 ll n, m, c[3][3], a[3][3], res[3][3];7

8void multi(ll a[3], ll b[3

]) 18

19int

main()

31 cout << res[1][1] << '

'<< res[1][2] <32 cout << res[2][1] << '

'<< res[2][2

];33}34

else cout << "

0 0\n0 0";

35return0;

36 }

2、矩陣封裝類**

1 #include 2

using

namespace

std;

34 typedef long

long

ll;5

6ll n, m, i, j, k, l;78

class

matrix

12 matrix(int i, int j, int k, int

l):13

a(, }) {}

14 friend matrix operator * (const matrix x, const

matrix y)

22};

2324

intmain()

36 cout << res.a[0][0] % m << '

'<< res.a[0][1] % m <37 cout << res.a[1][0] % m << '

'<< res.a[1][1] %m ;38}

39else cout << "

0 0\n0 0";

40return0;

41 }

四、相關知識點

6.2  快速冪

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

演算法訓練 矩陣乘方 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次...

藍橋杯試題 演算法訓練 矩陣乘方

資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,...

藍橋杯 ALGO 86 矩陣乘法

資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入兩個矩陣,分別是ms,sn大小。輸出兩個矩陣相乘的結果。輸入格式 第一行,空格隔開的三個正整數m,s,n 均不超過200 接下來m行,每行s個空格隔開的整數,表示矩陣a i,j 接下來s行,每行n個空格隔開的整數,表示矩陣b i...