from __future__ import print_function
from sys import stdin

def printf(str, *args):
    print(str % args, end='')

# matrixout 함수가 정방행렬 mx를 출력
def matrixout(mx, size):
    blanks = size * 7 + 2
    
    print("\u250c", end = "")
    for i in range(0,blanks):
        print(" ", end = "")
    print("\u2510")

    for i in range(0, size):
        print("| ", end = "")
        for j in range(0, size):
            print("% 1.3f" % mx[i][j], end = " ")
        print(" |")
    
    print("\u2514", end = "")
    for i in range(0,blanks):
        print(" ", end = "")
    print("\u2518")

# transposeMatrix 함수가 정방행렬 m의 전치행렬을 반환
def transposeMatrix(m):
    result = [[m[j][i] for j in range (len (m))] for i in range (len (m[0]))]
    return result

# getMatrixMinor 함수가 성분 (i,j)에 대한 소행렬식을 반환
def getMatrixMinor(m,i,j):
    minor_matrix = [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]
    return minor_matrix

# getMatrixDeternminant 재귀함수가 m에 대한 행렬식을 반환
def getMatrixDeternminant(m):
    # 2x2 행렬일 경우(기초 단계) : 
    if len(m) == 2:
        return m[0][0]*m[1][1]-m[0][1]*m[1][0]
    determinant = 0
    for c in range(len(m)):
        determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
    return determinant

# is_zero 함수가 행렬 m의 행렬식이 0인지 아닌지 알려줌
def is_zero(m, k):
    determinant = getMatrixDeternminant(m)   # 행렬식을 계산하는 함수 호출
    if(determinant==0):   # 행렬식이 0일 때 안내를 출력하고 프로그램을 멈춤
        print('오류! 해당 행렬의 행렬식은 0이다.')
        print('역행렬 계산은 불가능하다!')
        return 0

# getMatrixInverse 함수가 정방행렬 m의 역행렬을 반환
def getMatrixInverse(m): 
    determinant = getMatrixDeternminant(m)  # 행렬식을 계산하는 함수 호출
    # 차수가 2인 정방행렬의 역행렬을 계산해서 반환 
    if len(m) == 2:
        return [[m[1][1]/determinant, -1*m[0][1]/determinant],
                [-1*m[1][0]/determinant, m[0][0]/determinant]]

    # m의 각 성분에 대한 여인수를 계산
    cofactors = []   # 여인수들을 저장한 임시 행렬
    for r in range(len(m)):
        cofactorRow = []
        for c in range(len(m)):
            minor = getMatrixMinor(m,r,c)
            cofactorRow.append(((-1)**(r+c)) * getMatrixDeternminant(minor))
        cofactors.append(cofactorRow)
        
    # 여인수들로 이루어진 cofactors 정방행렬의 전치행렬을 Disjoint에 대입
    Disjoint = transposeMatrix(cofactors)
    
    # Disjoint의 각 성분의 값을 행렬식 값으로 나눔
    for r in range(len(Disjoint)):
        for c in range(len(Disjoint)):
            Disjoint[r][c] = Disjoint[r][c]/determinant
            
    return Disjoint   # 역행렬 반환

# 행렬의 차수에 입력 요구
k = int(input("정방행렬의 차수를 입력하라.: "))

# 차수가 k인 정방행렬을 정의하고 False 값들로 초기화
a = [[False for _ in range(k)] for _ in range(k)]   

printf("\n")
printf("%dx%d인 정방행렬 A를 입력하라.\n", k , k)

list = []   # 사용자가 입력할 정방행렬을 문자열로 받아주는 list 정의 

# 해당 while 문을 통해 사용자로부터 부울행렬을 줄별로 입력받음
while len(list) < k * k:
    list += stdin.readline().strip("\n").split()

# list에 있는 값들을 a에 대입
for i in range(0, k):
    for j in range(0, k):
        a[i][j] = int(list[i*k + j])

# 행렬 a의 행렬식이 0이 아니면 a에 대한 역행렬을 출력
if is_zero(a, k) != 0:
    print("\n해당 행렬의 역행렬은 다음과 같다.")
    matrixout(getMatrixInverse(a),k)
print() 
