만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

평행사변형

시간 제한1초메모리 제한64 MB

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

어려움10점 중 8점

유형
기하, 구현, 수학, 정수론
정답자
아직 제출이 없습니다

문제

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

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

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

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

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

입력

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

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

출력

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

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

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

  1. p=1p = 1, q=2q = 2로 두고, rr은 11번 점과 22번 점을 지나는 직선 위에 있지 않은 점 중 번호가 가장 작은 점으로 정한다.
  2. 세 점 pp, qq, rr의 xx좌표와 yy좌표가 모두 55 이상이면 이 단계를 건너뛴다. 그렇지 않으면 세 점을 함께 평행이동한다.
    • u=Pq−Pp=(ux,uy)u = P_q - P_p = (u_x, u_y), v=Pr−Pp=(vx,vy)v = P_r - P_p = (v_x, v_y), d=uxvy−uyvxd = u_x v_y - u_y v_x로 둔다. ss는 d>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_x는 mx+3kx∣d∣/g1≥5m_x + 3 k_x |d| / g_1 \ge 5를 만족하는 가장 작은 음이 아닌 정수이고, kyk_y는 my+3ky∣d∣/g2≥5m_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(PI−PK)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 이하로 유지된다.

예제3

  1. 예제 1

    입력
    3
    0 0
    4 0
    3 -1
    
    예상 출력
    24
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    
  2. 예제 2

    입력
    4
    5 0
    0 5
    -2 -2
    -3 2
    
    예상 출력
    61
    1 2 3
    1 3 2
    2 3 1
    2 1 3
    3 1 2
    3 2 1
    1 2 3
    1 3 2
    2 3 1
    2 1 3
    3 1 2
    3 2 1
    1 2 3
    1 3 2
    2 3 1
    2 1 3
    3 1 2
    3 2 1
    1 2 3
    1 3 2
    2 3 1
    2 1 3
    3 1 2
    3 2 1
    1 2 3
    1 3 2
    2 3 1
    2 1 3
    3 1 2
    3 2 1
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    2 1 3
    2 3 1
    1 3 2
    1 2 3
    3 2 1
    3 1 2
    1 2 4
    
  3. 예제 3

    입력
    3
    -1 -1
    -2 -2
    -3 -3
    
    예상 출력
    -1