평행사변형

N개의 점이 주어질 때, 한 점을 A+B-C로 옮기는 규칙을 정해진 절차에 따라 적용해 모든 점을 제1사분면으로 보내는 이동 열을 만들거나, 모든 점이 한 직선 위에 있으면 불가능을 판정하는 문제다.

어려움8기하구현수학정수론아직 제출이 없습니다시간 제한1초메모리 제한64 MB

문제

최근 "평행사변형"이라는 컴퓨터 게임이 인기를 끌고 있다. 게임을 시작하면 컴퓨터가 화면에 점 NN개를 그린다. 각 점의 좌표는 10-10 이상 1010 이하의 정수이다.

게임에서 할 수 있는 동작은 한 가지뿐이다. 한 직선 위에 있지 않은 세 점 AA, BB, CC를 고른 뒤 점 CC 대신 점 DD를 그린다. DDACBDACBD가 선분 ABAB를 한 대각선으로 하는 평행사변형이 되게 하는 점이다. 이런 점 DD는 항상 존재하고 유일하며, 좌표로 쓰면 D=A+BCD = A + B - C이다.

처음에는 모든 점의 좌표가 서로 다르지만, 게임 도중에는 두 개 이상의 점이 같은 좌표에 놓여도 된다. 새로 만들어지는 점의 좌표는 절댓값이 10910^9 이하여야 한다.

게임의 목표는 동작을 여러 번 해서 모든 점을 제1사분면으로 옮기는 것이다. 정확히 말하면 게임이 끝났을 때 모든 점의 두 좌표가 음이 아니어야 한다.

동작을 25002500번 이하로 해서 모든 점을 제1사분면으로 옮기는 방법을 구하거나, 그런 방법이 없다고 판정하라. 방법은 여러 가지일 수 있으므로 이 문제에서는 출력 절에 정한 규칙이 만드는 동작만 정답으로 인정한다.

입력

첫째 줄에 점의 개수 NN이 주어진다. (3N4003 \le N \le 400)

다음 NN개 줄 중 ii번째 줄에는 ii번 점의 좌표 XiX_i, YiY_i가 주어진다. (10Xi,Yi10-10 \le X_i, Y_i \le 10) 처음에 좌표가 같은 두 점은 없다.

출력

아래에서 점의 좌표는 벡터로 다루고, PiP_iii번 점의 현재 좌표이다.

모든 점의 두 좌표가 이미 음이 아니면 0을 출력한다. 그렇지 않고 모든 점이 한 직선 위에 있으면 어떤 동작도 할 수 없으므로 -1을 출력한다.

나머지 경우에는 첫째 줄에 동작의 수 MM을 출력하고, 다음 MM개 줄에 동작을 한 줄에 하나씩 서로 다른 세 번호 A B C로 출력한다. 이 동작은 CC번 점을 PA+PBPCP_A + P_B - P_C로 옮기고, AA번 점과 BB번 점은 그대로 둔다. 동작은 다음 규칙을 그대로 따라 만든다.

  1. p=1p = 1, q=2q = 2로 두고, rr11번 점과 22번 점을 지나는 직선 위에 있지 않은 점 중 번호가 가장 작은 점으로 정한다.
  2. 세 점 pp, qq, rrxx좌표와 yy좌표가 모두 55 이상이면 이 단계를 건너뛴다. 그렇지 않으면 세 점을 함께 평행이동한다.
    • u=PqPp=(ux,uy)u = P_q - P_p = (u_x, u_y), v=PrPp=(vx,vy)v = P_r - P_p = (v_x, v_y), d=uxvyuyvxd = u_x v_y - u_y v_x로 둔다. ssd>0d > 0이면 11, d<0d < 0이면 1-1이다.
    • g1=gcd(uy,vy)g_1 = \gcd(|u_y|, |v_y|), g2=gcd(ux,vx)g_2 = \gcd(|u_x|, |v_x|)이다. 단, gcd(0,k)=k\gcd(0, k) = k이다.
    • (a1,b1)=(svy/g1,suy/g1)(a_1, b_1) = (s v_y / g_1, -s u_y / g_1), (a2,b2)=(svx/g2,sux/g2)(a_2, b_2) = (-s v_x / g_2, s u_x / g_2)로 둔다. 그러면 a1u+b1v=(d/g1,0)a_1 u + b_1 v = (|d| / g_1, 0)이고 a2u+b2v=(0,d/g2)a_2 u + b_2 v = (0, |d| / g_2)이다.
    • mxm_x, mym_y는 세 점의 xx좌표 중 최솟값과 yy좌표 중 최솟값이다. kxk_xmx+3kxd/g15m_x + 3 k_x |d| / g_1 \ge 5를 만족하는 가장 작은 음이 아닌 정수이고, kyk_ymy+3kyd/g25m_y + 3 k_y |d| / g_2 \ge 5를 만족하는 가장 작은 음이 아닌 정수이다.
    • α=kxa1+kya2\alpha = k_x a_1 + k_y a_2, β=kxb1+kyb2\beta = k_x b_1 + k_y b_2로 둔다. α>0>β\alpha > 0 > \beta이면 γ=min(α,β)\gamma = \min(\alpha, -\beta), α<0<β\alpha < 0 < \beta이면 γ=min(α,β)\gamma = -\min(-\alpha, \beta), 그 밖의 경우에는 γ=0\gamma = 0이다. α=αγ\alpha' = \alpha - \gamma, β=β+γ\beta' = \beta + \gamma로 둔다.
    • 서로 다른 세 번호 II, JJ, KK에 대해 블록 [I,J,K][I, J, K]는 여섯 동작 I J K, I K J, J K I, J I K, K I J, K J I를 이 순서대로 하는 것이다. 블록 하나는 세 점을 3(PIPK)3(P_I - P_K)만큼 평행이동하고, 각 번호의 점은 자기 자리의 평행이동된 위치로 간다.
    • 먼저 α>0\alpha' > 0이면 블록 [q,r,p][q, r, p]α\alpha'번, 그렇지 않으면 블록 [p,r,q][p, r, q]α-\alpha'번 한다. 다음으로 β>0\beta' > 0이면 블록 [r,q,p][r, q, p]β\beta'번, 그렇지 않으면 블록 [p,q,r][p, q, r]β-\beta'번 한다. 마지막으로 γ>0\gamma > 0이면 블록 [q,p,r][q, p, r]γ\gamma번, 그렇지 않으면 블록 [r,p,q][r, p, q]γ-\gamma번 한다. 이 단계가 끝나면 세 점의 좌표는 모두 55 이상이다.
  3. pp, qq, rr가 아닌 점을 번호가 작은 것부터 차례로 보면서, 좌표 중 음수가 있는 점 cc마다 동작 a b c를 한 번 한다. (a,b)(a, b)(p,q)(p, q), (p,r)(p, r), (q,r)(q, r) 중 점 cc와 한 직선 위에 있지 않은 첫 번째 쌍이다. 옮겨진 점 cc의 두 좌표는 음이 아니다.

이 규칙이 만드는 동작은 항상 25002500개 이하이고, 모든 좌표의 절댓값은 10910^9 이하로 유지된다.