n×n 행렬 A의 행렬식(determinant) detA는 아래와 같이 정의한다. 아래 식에서 a_ij는 A의 i행 j열에 위치한 원소를 나타낸다. 또한 S_n는 1,⋯,n의 순열들의 집합으로, 각 σ∈S_n에 대해 1,⋯,n=σ(1),⋯,σ(n)을 만족한다.
detA=∑_σ∈S_nsgn(σ)⋅(∏_i=1na_iσ(i))
A의 characteristic polynomial ϕ_A(x)는 x에 대한 n차 다항식으로, ϕ_A(x)=det(xI−A)=c_nxn+c_n−1xn−1+⋯+c_0로 정의한다.
이번에는 행렬 A의 원소가 다소 특이하다. 1보다 큰 제곱수로 나누어떨어지지 않는 정수 D=1가 주어진다. 이 때 A의 모든 원소는 두 정수 a+bD 꼴로 나타낼 수 있는 수로, 아래와 같이 정의된 집합 ZD의 원소이다.
Z\[D]=a+bD∣a,b∈Z
각 원소가 Z\[D]에 속하는 행렬 A가 주어진다. 이 때 ϕ_A(x)의 계수 c_0,⋯,c_n 또한 Z\[D]의 원소임을 증명할 수 있다. 또한, c_i=p_i+q_iD를 만족하는 정수 p_i,q_i 또한 유일하게 존재한다. 주어진 정수 M에 대해, 각 p_i와 q_i를 M으로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력의 첫 줄에 행렬의 크기를 나타내는 정수 n과 나눗셈에 사용되는 정수 M, 정수 D가 주어진다.
둘째 줄부터 n개의 줄에 걸쳐 행렬 A의 원소가 주어진다. 각 줄에는 2n개의 정수가 주어지며, 이 중 i번째 줄의 2j−1번째 수를 x, 2j번째 수를 y라고 하면 a_ij=x+yD를 만족한다.
총 n+1개의 줄에 걸쳐, i번째 줄에는 p_i와 q_i를 M으로 나눈 나머지를 공백으로 구분지어 출력한다.
정수 a를 M으로 나눈 나머지란, a−b가 M의 배수가 되는 가장 작은 음 아닌 정수 b를 의미한다.