一、題目
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 2using
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 2using
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...