資源限制
時間限制: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較大時無法使用。下面給出一種較快的演...