1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 行列計算メニュー(言語選択)
  4. 問題一覧 JavaScript編
  5. ブロック行列の和 JavaScript編

行列計算メニューのサムネイル
ブロック行列の和 JavaScript編(paizaランク A 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

これまでの問題では N ✕ N 行列同士の掛け算は 3 重 for ループを用いておこなっていたため、時間計算量は O(N^3) でした。
しかし、より少ない時間計算量での行列積の計算が可能なことが知られています。
ここからはそのようなアルゴリズムの 1 つである「シュトラッセンのアルゴリズム」に関する問題です。

i 行 j 列目の要素が行列である行列をブロック行列 (または区分行列) と呼びます。
ブロック行列は通常の行列の要素をブロック分けしたもので、表現が異なるだけであり、通常の行列と違いはありません。
例えば、行列 A をブロック行列 で表すと、次のようになります。



ブロック行列 A と B の足し算は次のように定義されます。
ただし、この問題では A, B は N 次正方ブロック行列で、各要素 A_{i, j}, B_{i, j} (1 ≦ i, j ≦ N) は M 次正方行列とします。
実際には、ブロック行列の要素である行列 A_{i, j}, B_{i, j} やブロック行列そのものは正方行列である必要はありません。



A に B を足した結果は、i 行 j 列目の要素が A_{i, j} と B_{i, j} を足した行列であるブロック行列となります。
通常の行列をブロック行列として表すことで、計算の見通しが立ちやすくなる等の利点があります。

ブロック行列 A, B が与えられます。
A と B を足した結果となるブロック行列 C を計算してください。


入力例 1 において与えられるブロック行列 A, B およびブロック行列 C = A+B は次のようになります。



入力例 2 において与えられるブロック行列 A, B およびブロック行列 C = A+B は次のようになります。



入力例 3 において与えられるブロック行列 A, B およびブロック行列 C = A+B は次のようになります。

入力される値

N M
A_{1,1}
A_{1,2}
...
A_{1,N}
A_{2,1}
A_{2,2}
...
A_{2,N}
...
A_{N,N}
B_{1,1}
B_{1,2}
...
B_{1,N}
B_{2,1}
B_{2,2}
...
B_{2,N}
...
B_{N,N}


・1 行目ではブロック正方行列のサイズ N とその要素となる行列のサイズ M が与えられます。
・2 行目からは A の i 行 j 列目の要素である行列 A_{i, j} が N^2 個、後述するフォーマットで与えられます。
・その後、B の i 行 j 列目の要素である行列 B_{i, j} が N^2 個、同じフォーマットで与えられます。

行列 A_{i, j} は次の形式で与えられます。行列 B_{i, j} も同じ形式です。

a_{1,1} a_{1,2} ... a_{1,M}
a_{2,1} a_{2,2} ... a_{2,M}
...
a_{M,1} a_{M,2} ... a_{M,M}


・行列 A_{i, j} の h 行 w 列目の要素を a_{h, w} と表記します。
・行列 A_{i, j} の入力は M 行にわたり、行列 A の要素 a_{h, w} が、行ごとに、空白区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

ブロック行列 C = A + B の i 行 j 列目の要素となる行列 C_{i, j} を次のように出力してください。
ただし、C_{i, j} は後述するフォーマットにしたがって出力をおこなってください。

C_{1,1}
C_{1,2}
...
C_{1,N}
C_{2,1}
C_{2,2}
...
C_{2,N}
...
C_{N,N}


行列 C_{i, j} は M 次正方行列です。その h 行 w 列目の要素を c_{h, w} と表記します。
行列 C_{i, j} はそれぞれ次のフォーマットに従い、行ごとに、空白区切りで出力をおこなってください。

c_{1,1} c_{1,2} ... c_{1,M}
c_{2,1} c_{2,2} ... c_{2,M}
...
c_{M,1} c_{M,2} ... c_{M,M}


末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて, 以下の条件をみたします

・入力はすべて整数
・1 ≦ N, M ≦ 10
・-10^3 ≦ a_{h, w}, b_{h, w} ≦ 10^3 (1 ≦ h ≦ M, 1 ≦ w ≦ M)

入力例1

2 2
1 2
5 6
3 4
7 8
9 10
13 14
11 12
15 16
2 1
6 5
4 3
8 7
7 6
3 2
5 4
1 0

出力例1

3 3
11 11
7 7
15 15
16 16
16 16
16 16
16 16

入力例2

1 2
4 1
0 -2
-3 0
7 8

出力例2

1 1
7 6

入力例3

3 1
2
6
-2
0
-1
3
3
0
6
6
4
-3
3
1
-1
-5
-2
2

出力例3

8
10
-5
3
0
2
-2
-2
8

問題一覧へ戻る

ページの先頭へ戻る