繰り返し二乗法・ダブリングメニューのサムネイル
行列累乗 Scala編(paizaランク A 相当)

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

問題

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

前問では、行列 A と行列 B の積 AB を計算しました。
行列 A の二乗も、他の二乗と同じように A^2 = AA として計算されます。

繰り返し二乗法の場合には result = 1 として初期化しましたが、行列場合には、次のように初期化することでうまく計算できます。

・ result = 単位行列 I (I_{ii} = 1, それ以外の要素は 0 の行列)* とします。
・ i = 1 から k まで、以下の処理を繰り返す。(k は最大のビット数とします。)
1. n の下から i 番目のビットが 1 であるならば、result <- result・x とする。
2. x <- x・x とする。

では、繰り返し二乗法を用いて、行列 A の k 乗を計算してください。
ただし、答えは非常に大きくなる可能性があるので、10000000 = 10^7 で割ったあまりを求めてください。

* 単位行列を実際に式で表すと、
I =
[[1, 0, ..., 0],
[0, 1, ..., 0],
...,
[0, 0, ..., 1]]
となります。

入力される値

n k
a_{11} a_{12} ... a_{1n}
a_{21} a_{22} ... a_{2n}
...
a_{n1} a_{n2} ... a_{nn}


・ 1 行目に整数 n と整数 k が半角スペース区切りで与えられます。
・ 続く n 行には、行列 a の各行の要素が半角スペース区切りで与えられます。


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

合計 n 行出力してください。
i 行目には、{A^k}_{i1} {A^k}_{i2} ... {A^k}_{in} を半角スペース区切りで出力してください。
ただし、それぞれの要素は 10000000 = 10^7 で割ったあまりを出力してください。

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

条件

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

・ 入力はすべて整数
・ 1 ≦ n ≦ 100
・ 1 ≦ k ≦ 2^20
・ 0 ≦ a_{ij} ≦ 100 (1 ≦ i, j ≦ n)

入力例1

2 2
1 2
3 4

出力例1

7 10
15 22

入力例2

4 4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

出力例2

64 64 64 64
64 64 64 64
64 64 64 64
64 64 64 64

問題一覧へ戻る

  1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 繰り返し二乗法・ダブリングメニュー(言語選択)
  4. 問題一覧 Scala編
  5. 行列累乗 Scala編
ページの先頭へ戻る