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

2021-10-03 05:25:04 字數 1201 閱讀 1599

資源限制

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

0 1樣例輸出

1 00 1

思路:本題用矩陣的b次方再對m取餘,由於b這個數很大會造成執行超時,所以得按奇數和偶數簡化求值。

**如下:

#include

#include

#define w 2

int a[w]

[w],b[w]

[w];

voidjs(

int x[w]

[w],

int y[w]

[w],

int m1)

;for

(int i=

0;i) t1[i]

[j]%

=m1;}}

memcpy

(x,t1,

sizeof

(t1));

}int

main()

}for

(i=0

;i)else}}

while

(n>0)

n/=2

;js(a,a,m);}

for(i=

0;i)printf

("\n");

}return0;

}

藍橋杯 試題 演算法訓練 關聯矩陣

問題描述 有乙個n個結點m條邊的有向圖,請輸出他的關聯矩陣。輸入格式 第一行兩個整數n m,表示圖中結點和邊的數目。n 100,m 1000。接下來m行,每行兩個整數a b,表示圖中有 a,b 邊。注意圖中可能含有重邊,但不會有自環。輸出格式 輸出該圖的關聯矩陣,注意請勿改變邊和結點的順序。樣例輸入...

演算法訓練 矩陣乘方

問題描述 給定乙個矩陣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較大時無法使用。下面給出一種較快的演...