띠 행렬의 LU 분해
시간 제한3초메모리 제한128 MB
삼중대각행렬을 대각 성분이 1인 하삼각행렬과 상삼각행렬의 곱으로 분해하고 분해가 불가능하면 -1을 출력합니다.
문제
행렬 가 주어진다. LU 분해는 꼴의 곱으로 나누는 것이다. 은 하삼각행렬, 는 상삼각행렬이다.
- 하삼각행렬은 일 때 인 행렬이다.
- 상삼각행렬은 일 때 인 행렬이다.
이 문제에서는 띠의 폭이 1인 띠 행렬만 다룬다. 즉 는 주대각선과 바로 위아래 대각선에만 값이 있고, 나머지 자리는 모두 0이다.
의 대각 성분이 모두 1이 되도록 하는 과 를 구한다. 이런 과 는 존재하면 하나뿐이다.
입력
첫째 줄에 정사각 행렬의 크기 ()이 주어진다. 다음 개의 줄에 행렬 의 성분이 한 줄에 개씩 순서대로 주어진다.
모든 성분은 절댓값이 1000 이하인 정수이고, 인 자리의 성분은 항상 0이다. 분해가 존재하는 입력에서는 과 의 모든 성분의 절댓값이 이하임이 보장된다.
출력
분해가 존재하고 의 대각 성분이 모두 0이 아니면, 먼저 개의 줄에 을 출력하고 이어서 개의 줄에 를 출력한다. 각 줄에는 그 행의 성분 개를 공백 하나로 구분해 적는다.
각 성분은 정확한 값을 소수 넷째 자리에서 반올림해 소수 셋째 자리까지 출력한다. 반올림은 0에서 먼 쪽으로 한다. 예를 들어 는 0.063, 는 -0.063이 된다. 반올림한 값이 0이면 부호를 붙이지 않고 0.000으로 출력한다.
분해가 불가능하거나 의 대각 성분 중에 0이 있으면 첫째 줄에 -1만 출력한다.