演算法提高 矩陣乘方

2021-08-25 08:34:26 字數 1309 閱讀 4797

/*問題描述

給定乙個矩陣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

0 141 18467

6334 26500

1 2134

19169 15724

11478 29358

*/

#include void shuru( int [2] , int );

void shuchu( int [2] , int );

void copy( int [2] , int [2] , int );

void q_chengfang( int [2] , int , int );

void jisuan(int [2], int [2] , int );

int main(void)

void jisuan(int jz1[2], int jz2[2] , int m)

t[i][j] = sum % m ;}}

copy( jz1 , t , 2 );

}void q_chengfang( int jz[2] , int p_b , int p_m)

else}}

return;

}else

else

}}void copy( int a[2] , int b[2] , int n )

}}void shuchu( int jz[2] ,int n)

putchar('\n'); }}

void shuru( int jz[2] , int n )

}}

演算法訓練 矩陣乘方

問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...

演算法訓練 矩陣乘方

問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...

藍橋杯 ADV 61 演算法提高 矩陣乘方

問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...