問題描述
給定乙個矩陣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 2
1 1
0 1
樣例輸出
1 0
0 1
#include
#define size 2
void copy(int a[size], int b[size])
else}}
return;
}if(b%2 != 0)else
}int main()
}getresult(a, b, m);
for(i=0; ifor(j=0; jprintf("%d ", a[i][j]);
}printf("\n");
}return
0;}
演算法訓練 矩陣乘方
問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...
藍橋杯試題 演算法訓練 矩陣乘方
資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,...
演算法提高 矩陣乘方
問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...