import sys
import numpy as np
def main():
# 標準入力からデータをすべて読み込む
input_data = sys.stdin.read().split()
if not input_data:
return
iterator = iter(input_data)
try:
# 1行目: n (次元数)
n = int(next(iterator))
# 2行目以降: 行列 A の要素
# n * n 個の要素を読み込んで行列に変換
a_elements = []
for _ in range(n * n):
a_elements.append(int(next(iterator)))
A = np.array(a_elements, dtype=float).reshape(n, n)
except StopIteration:
return
# ベクトル b を作成(要素がすべて 1 の n 次元ベクトル)
b = np.ones(n)
# 行列 A の行列式 |A| を計算
det_A = np.linalg.det(A)
# 解のベクトル x を格納するリスト
x = []
# クラメルの公式による計算
# x_i = |A_i| / |A|
for i in range(n):
# A をコピーして A_i を作成
A_i = A.copy()
# A_i の i 列目をベクトル b で置き換え
# numpyのスライス機能 A[:, i] で i列目を指定
A_i[:, i] = b
# |A_i| を計算
det_A_i = np.linalg.det(A_i)
# 解の要素を計算してリストに追加
x_i = det_A_i / det_A
x.append(x_i)
# 結果を出力 (スペース区切りで1行に表示)
print(*(x))
if __name__ == '__main__':
main()
aW1wb3J0IHN5cwppbXBvcnQgbnVtcHkgYXMgbnAKCmRlZiBtYWluKCk6CiAgICAjIOaomea6luWFpeWKm+OBi+OCieODh+ODvOOCv+OCkuOBmeOBueOBpuiqreOBv+i+vOOCgAogICAgaW5wdXRfZGF0YSA9IHN5cy5zdGRpbi5yZWFkKCkuc3BsaXQoKQogICAgCiAgICBpZiBub3QgaW5wdXRfZGF0YToKICAgICAgICByZXR1cm4KCiAgICBpdGVyYXRvciA9IGl0ZXIoaW5wdXRfZGF0YSkKICAgIAogICAgdHJ5OgogICAgICAgICMgMeihjOebrjogbiAo5qyh5YWD5pWwKQogICAgICAgIG4gPSBpbnQobmV4dChpdGVyYXRvcikpCiAgICAgICAgCiAgICAgICAgIyAy6KGM55uu5Lul6ZmNOiDooYzliJcgQSDjga7opoHntKAKICAgICAgICAjIG4gKiBuIOWAi+OBruimgee0oOOCkuiqreOBv+i+vOOCk+OBp+ihjOWIl+OBq+WkieaPmwogICAgICAgIGFfZWxlbWVudHMgPSBbXQogICAgICAgIGZvciBfIGluIHJhbmdlKG4gKiBuKToKICAgICAgICAgICAgYV9lbGVtZW50cy5hcHBlbmQoaW50KG5leHQoaXRlcmF0b3IpKSkKICAgICAgICAgICAgCiAgICAgICAgQSA9IG5wLmFycmF5KGFfZWxlbWVudHMsIGR0eXBlPWZsb2F0KS5yZXNoYXBlKG4sIG4pCiAgICAgICAgCiAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICByZXR1cm4KCiAgICAjIOODmeOCr+ODiOODqyBiIOOCkuS9nOaIkO+8iOimgee0oOOBjOOBmeOBueOBpiAxIOOBriBuIOasoeWFg+ODmeOCr+ODiOODq++8iQogICAgYiA9IG5wLm9uZXMobikKCiAgICAjIOihjOWIlyBBIOOBruihjOWIl+W8jyB8QXwg44KS6KiI566XCiAgICBkZXRfQSA9IG5wLmxpbmFsZy5kZXQoQSkKCiAgICAjIOino+OBruODmeOCr+ODiOODqyB4IOOCkuagvOe0jeOBmeOCi+ODquOCueODiAogICAgeCA9IFtdCgogICAgIyDjgq/jg6njg6Hjg6vjga7lhazlvI/jgavjgojjgovoqIjnrpcKICAgICMgeF9pID0gfEFfaXwgLyB8QXwKICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICMgQSDjgpLjgrPjg5Tjg7zjgZfjgaYgQV9pIOOCkuS9nOaIkAogICAgICAgIEFfaSA9IEEuY29weSgpCiAgICAgICAgCiAgICAgICAgIyBBX2kg44GuIGkg5YiX55uu44KS44OZ44Kv44OI44OrIGIg44Gn572u44GN5o+b44GICiAgICAgICAgIyBudW1weeOBruOCueODqeOCpOOCueapn+iDvSBBWzosIGldIOOBpyBp5YiX55uu44KS5oyH5a6aCiAgICAgICAgQV9pWzosIGldID0gYgogICAgICAgIAogICAgICAgICMgfEFfaXwg44KS6KiI566XCiAgICAgICAgZGV0X0FfaSA9IG5wLmxpbmFsZy5kZXQoQV9pKQogICAgICAgIAogICAgICAgICMg6Kej44Gu6KaB57Sg44KS6KiI566X44GX44Gm44Oq44K544OI44Gr6L+95YqgCiAgICAgICAgeF9pID0gZGV0X0FfaSAvIGRldF9BCiAgICAgICAgeC5hcHBlbmQoeF9pKQoKICAgICMg57WQ5p6c44KS5Ye65YqbICjjgrnjg5rjg7zjgrnljLrliIfjgorjgacx6KGM44Gr6KGo56S6KQogICAgcHJpbnQoKih4KSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCk=