정수론과 응용

시간 제한0.2초메모리 제한16 MB

요약
각 좌표의 절댓값이 10^9 이하인 가우스 정수 두 개를 입력받아 두 수의 최대공약수를 모두 사전순으로 출력합니다.
난이도

어려움10점 중 8점

유형
정수론, 수학, 분할 정복, 정렬
정답자
아직 제출이 없습니다

문제

정수론을 응용하자. 실수부와 허수부가 정수인 복소수를 가우시안 수라고 한다.

\begin{equation*} G=\left{x+yi:::x,y\in\mathbb{Z}\right},\qquad\text{where}\quad i^2=-1 \end{equation*}

가우시안 수에서는 정수의 약수, 공약수, 최대공약수 개념을 그대로 확장할 수 있다.

  • 두 가우시안 수 n,mn,m에 대해 어떤 가우시안 수 k∈Gk\in G가 존재해 m=n⋅km=n\cdot k를 만족할 때, nn을 mm의 약수라고 한다. nn이 mm의 약수라는 관계를 n∣mn\mid m으로 적는다.
  • 두 가우시안 수 n,mn,m에 대해, 가우시안 수 dd가 nn의 약수이자 mm의 약수일 때, dd를 nn과 mm의 공약수라고 한다.
  • 두 가우시안 수 n,mn,m의 공약수 gg가 다른 모든 공약수 dd에 대해 d∣gd\mid g를 만족할 때, gg를 최대공약수라고 한다.

두 가우시안 수가 주어졌을 때, 두 수의 모든 최대공약수를 구하는 프로그램을 작성하시오.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다. 테스트 케이스는 최대 1,000개 주어진다.

둘째 줄부터 (T+1)(T+1)번째 줄에 걸쳐 각 줄마다 하나의 테스트 케이스가 주어진다. 각 테스트 케이스는 −109-10^9 이상, 10910^9 이하인 4개의 정수 a,b,c,da,b,c,d가 공백으로 구분해 주어진다. 이 입력은 가우시안 수 n=a+bin=a+bi, m=c+dim=c+di에 해당한다. a=b=0a=b=0 혹은 c=d=0c=d=0인 경우는 주어지지 않는다.

출력

가우시안 수 x+yix+yi는 xx를 출력하고 공백을 두고 yy를 출력하는 방식으로 출력한다. 각 테스트 케이스마다 첫 줄에는 최대공약수의 수를 출력하고, 두 번째 줄에는 최대공약수들을 lexicographic order으로 출력한다. 즉, a<ca<c 혹은 a=ca=c와 b<db<d일 때, a+bia+bi를 c+dic+di보다 먼저 출력한다.

힌트

최대공약수는 정수에서도 유일하지 않다. 예를 들어 정수 gg가 두 정수 n,mn,m의 최대공약수라면, −g-g도 n,mn,m의 최대공약수이다.

예제1

  1. 예제 1

    입력
    3
    6 0 9 0
    2 1 -2 -1
    6 -7 3 5
    예상 출력
    4
    -3 0 0 -3 0 3 3 0
    4
    -2 -1 -1 2 1 -2 2 1
    4
    -4 -1 -1 4 1 -4 4 1