[python Python]白準10830次行列の平方を解く
12994 ワード
質問する
問題は本当に簡単です.
与えられた行列のB二乗だけを要求すればよい.
言葉は簡単だが、入力は1000億に達する.
入力も大きく、平方なら分割征服で近づけるのでしょうか…?こんな想いで近づけば
さらに平方分征服を加えると、すべての問題が解決されると思います.
これはどこが間違っているのか悩ましい問題です...
に答える
def multiply(matrix1, matrix2):
global n
result = []
for i in range(n):
result2 = []
for j in range(n):
value = 0
for t in range(n):
value += matrix1[i][t] * matrix2[t][j]
result2.append(value % 1000)
result.append(result2)
return result
マトリクスの総計算は(マトリクスサイズ)^3なので簡単(?)3つのforゲートで処理しましょうあ、問題は残りの1000を1000で割るので、%1000を続けます.
(結果のみを…で割ると、数字が大きすぎて実行できません...)
def power(matrix, exponent):
if exponent <= 1:
return matrix
else:
if exponent % 2 == 0:
new_exponent = power(matrix, exponent // 2)
return multiply(new_exponent, new_exponent)
else:
new_exponent = power(matrix, exponent // 2)
return multiply(multiply(new_exponent, new_exponent), matrix)
ただし、整数とは異なり、デフォルト値を行列として…!そして
new_exponent
を計算するときに整数除算を書きます...今は入力のみを受け入れ、関数に入れるだけでいいです.
しかし、80%の障害の中で、私は塞がれていました...、、
最後にテープを入力しました.
マトリクス要素が1000、Bが1の場合、残りの1000を出力する場合は0でなければなりません.
Bが1のとき、関数を呼び出さずにそのまま出力してしまい、1000はそのまま出てきたのでエラー…
とにかく、それを補うだけで、スムーズに完成することができます…!
コード#コード#
def multiply(matrix1, matrix2):
global n
result = []
for i in range(n):
result2 = []
for j in range(n):
value = 0
for t in range(n):
value += matrix1[i][t] * matrix2[t][j]
result2.append(value % 1000)
result.append(result2)
return result
def power(matrix, exponent):
if exponent <= 1:
return matrix
else:
if exponent % 2 == 0:
new_exponent = power(matrix, exponent // 2)
return multiply(new_exponent, new_exponent)
else:
new_exponent = power(matrix, exponent // 2)
return multiply(multiply(new_exponent, new_exponent), matrix)
n, k = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(n)]
if k == 1:
for i in range(n):
for j in range(n):
mat[i][j] = mat[i][j] % 1000
z = mat
else:
z = power(mat, k)
for x in range(n):
print(*z[x])
終わりだ!Reference
この問題について([python Python]白準10830次行列の平方を解く), 我々は、より多くの情報をここで見つけました https://velog.io/@ashooozzz/Python-파이썬백준-10830번-행렬-제곱-풀이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol