1.タイトル
タイトルリンク
http://lx.lanqiao.cn/problem.page?gpid=T58
問題の説明
N次の行列Aが与えられた場合、出力AのM乗(Mは負でない整数)
例:
A =
1 2
3 4
Aの2
7 10 15 22 乗
例:
A =
1 2
3 4
Aの2
7 10 15 22 乗
入力フォーマット
最初の行は正の整数N、M(1 <= N <= 30、0 <= M <= 5)で、行列Aの順序と必要な検出力を示します。
次のN行、行ごとのN絶対値行列Aの値を表す10以下の非負の整数
次のN行、行ごとのN絶対値行列Aの値を表す10以下の非負の整数
出力フォーマット
合計N行が出力されます。各行にN個の整数があり、AのM乗に対応する行列を表します。隣接する数字はスペースで区切られます
入力例
2 2
1 2
3 4
1 2
3 4
出力例
7 10
15 22
15 22
2.解決する
アイデア:3つの行列を使用します。c行列は結果行列、行列は元の行列、b行列は現在の計算データを一時的に格納するc行列です。c [i] [j] + = c [i] [h] * c [h] [j]の場合(hは1からn)
1 #include <アルゴリズム> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 名前空間stdを使用; 7 int a [35] [35]、b [35] [ 35]、C [35] [35]; // B初期行列が単位行列である 8。 整数N、M; 9 10 空隙 myprint(int型 B [] [35]){ // アレイ出力値 11 のための(INTは私= 1; i <= N; i ++ ){ 12 for(int j = 1; j <= N; j ++ ){ 13 if(j!= N)cout << b [i] [j] << "" ; 14 else cout << b [i] [j] << endl; 15 } 16 } 17 } 18 void Fun(int b [] [35]、int c [] [35]){ // b数组的值赋给c数组 19 for(int i = 1; i <= N ; i ++ ){ 20 for(int j = 1; j <= N; j ++ ){ 21 c [i] [j] = b [i] [j]; 22 } 23 } 24 } 25 int main(){ 26 cin >> N >> M; 27 28 for(int i = 1; i <= N; i ++ ){ 29 for(int j = 1; j <= N; j ++ ){ 30 cin >> a [i] [ j]; 31 c [i] [j] = a [i] [j]; // 配列とc配列は行列A 32 if(i == j)b [i] [j] = 1; // b配列は単位行列 33 else b [i] [j] = 0 ; 34 } 35 } 36 if(M == 0)Myprint(b); // 出力単位行列 37 else if(M == 1 )Myprint( a); 38 else { 39 for(int t = 2; t <= M; t ++){ // M乗 40 // 注:行列とc行列の計算結果ごとに、b配列が最初に格納されます。配列ストレージ、計算が混合され、結果が間違っている 41 for(int i = 1; i <= N; i ++ ){ 42 for(int j = 1; j <= N; j ++ ){ 43 for(int h = 1; h <= N; h ++ ){ 44 if(h == 1)b [i] [j] = c [i] [h] * a [h] [j]; 45 else b [i] [ j] + = c [i] [h] * a [h] [j]; 46 } 47 } 48 } 49 Fun(b、c); // 配列bの値を配列cに割り当てます 50 } 51 Myprint(c); 52 } 53 return 0 ; 54 }