라우터 6

주어진 연결 수와 전력 한도 안에서 N개의 입력을 N개의 출력에 연결하는 수집기, 허브, 분배기 계층 구조의 라우터를 구성합니다.

보통6그래프구현수학아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

헨리와 헤티는 네트워크 회사에 입사했고, 첫 프로젝트로 라우터 Connect Ethernet Operating Interface 2016을 만든다. 라우터는 다음으로 구성된다.

  • 입력 노드 NN개, 번호는 11번부터 NN번까지
  • 출력 노드 NN개, 번호는 N+1N+1번부터 2N2N번까지
  • 내부 노드 KK개, 번호는 2N+12N+1번부터 2N+K2N+K번까지
  • 서로 다른 두 노드를 잇는 단방향 직접 연결 MM

노드 XX가 노드 YY로 데이터를 보낼 수 있다는 말은 YYXX에서 데이터를 받을 수 있다는 말과 같고, 다음 중 하나가 성립한다는 뜻이다. X=YX = Y이거나, XX가 데이터를 보낼 수 있는 노드 ZZ가 있고 ZZ에서 YY로 가는 직접 연결이 있다.

XXYY로 데이터를 보낼 수 있고 XYX \neq Y일 때, XX에서 YY로 가는 데이터 경로는 L2L \geq 2, A1=XA_1 = X, AL=YA_L = Y를 만족하는 직접 연결의 집합 {(A1,A2),(A2,A3),,(AL1,AL)}\{(A_1, A_2), (A_2, A_3), \ldots, (A_{L-1}, A_L)\}이다.

라우터는 다음 다섯 조건을 모두 만족할 때 제대로 동작한다.

  • 모든 입력 노드가 모든 출력 노드로 데이터를 보낼 수 있다
  • 모든 입력 노드는 자기 자신에서만 데이터를 받을 수 있다
  • 모든 출력 노드는 자기 자신으로만 데이터를 보낼 수 있다
  • XYX \neq Y인 두 노드에서 XXYY로 데이터를 보낼 수 있으면 YYXX로 데이터를 보낼 수 없다
  • XYX \neq Y인 두 노드에서 XXYY로 데이터를 보낼 수 있으면 XX에서 YY로 가는 데이터 경로가 유일하다. 특히 두 노드를 잇는 직접 연결은 최대 한 개다

노드 XX를 돌리는 데 드는 전력은 PX=INX×OUTXP_X = IN_X \times OUT_X이다. INXIN_XXX로 데이터를 보낼 수 있는 입력 노드의 개수, OUTXOUT_XXX에서 데이터를 받을 수 있는 출력 노드의 개수다. 라우터가 쓰는 최대 전력은 Pmax=max(P1,P2,,P2N+K)P_{max} = \max(P_1, P_2, \ldots, P_{2N+K})다.

제대로 동작하는 라우터를 만들어라. 입력 노드와 출력 노드가 각각 정확히 NN개여야 하고, 직접 연결은 MlimM_{lim}개 이하여야 하며, PmaxPlimP_{max} \le P_{lim}이어야 하고, 전체 노드 수는 Ntot=2N+K500000N_{tot} = 2N + K \le 500\,000이어야 한다.

이 조건을 만족하는 라우터는 여러 개여서 출력 항목에서 그중 하나를 정해 두었다. 그 라우터를 출력하면 된다.

입력

한 줄에 정수 NN, MlimM_{lim}, PlimP_{lim}이 주어진다. 차례대로 입력 노드의 개수, 허용되는 직접 연결의 최대 개수, 허용되는 최대 전력이다. 출력 노드의 개수도 NN과 같다.

1N100001 \le N \le 10\,000, 1Mlim5000001 \le M_{lim} \le 500\,000, NPlim1000000N \le P_{lim} \le 1\,000\,000이다. 모든 입력 노드 XXINX=1IN_X = 1, OUTX=NOUT_X = N이므로 답이 존재하려면 PlimNP_{lim} \ge N이어야 한다.

모든 테스트 데이터에서 출력 항목이 정한 라우터의 직접 연결 개수는 MlimM_{lim}개 이하다.

출력

아래 규칙으로 만든 라우터를 출력한다. 이 라우터는 제대로 동작하고 최대 전력이 PlimP_{lim} 이하다.

먼저

g=min(N,PlimN),c=Plim,b=cgg = \min\left(N, \left\lfloor \frac{P_{lim}}{N} \right\rfloor\right), \qquad c = \left\lfloor \sqrt{P_{lim}} \right\rfloor, \qquad b = \left\lfloor \frac{c}{g} \right\rfloor

로 둔다.

입력 노드를 연속한 gg개씩 묶어 S=N/gS = \lceil N / g \rceil개의 그룹으로 자른다. 입력 그룹 jj는 입력 노드 (j1)g+1(j-1)g+1번부터 min(jg,N)\min(jg, N)번까지를 담으므로 마지막 그룹은 다른 그룹보다 작을 수 있다. 출력 노드도 같은 방식으로 자른다. 출력 그룹 jj는 출력 노드 N+(j1)g+1N + (j-1)g + 1번부터 N+min(jg,N)N + \min(jg, N)번까지를 담는다.

그룹 번호 11부터 SS까지를 연속한 bb개씩 묶어 B=S/bB = \lceil S / b \rceil개의 블록으로 자른다. 블록 kk는 그룹 번호 (k1)b+1(k-1)b+1부터 min(kb,S)\min(kb, S)까지를 담고, 그룹 jj는 블록 (j1)/b+1\lfloor (j-1)/b \rfloor + 1에 속한다. 입력 쪽과 출력 쪽은 같은 블록 구분을 쓴다.

내부 노드는 K=2S+B2K = 2S + B^2개이고 다음 순서로 번호를 붙인다.

  • 입력 그룹마다 모으는 노드 하나. 2N+j2N + j번 노드가 입력 그룹 jj의 모으는 노드다
  • 블록 쌍마다 중계 노드 하나. 2N+S+(k1)B+l2N + S + (k-1)B + l번 노드가 (입력 블록 kk, 출력 블록 ll) 쌍의 중계 노드다
  • 출력 그룹마다 나누는 노드 하나. 2N+S+B2+j2N + S + B^2 + j번 노드가 출력 그룹 jj의 나누는 노드다

직접 연결은 다음 순서로 출력한다.

  1. 입력 그룹 jj를 번호가 커지는 순서로, 그 그룹에 속한 입력 노드 xx를 번호가 커지는 순서로 보면서, xx에서 그룹 jj의 모으는 노드로 가는 연결
  2. 입력 그룹 jj를 번호가 커지는 순서로, 출력 블록 ll을 번호가 커지는 순서로 보면서, 그룹 jj의 모으는 노드에서 (그룹 jj가 속한 블록, 블록 ll) 쌍의 중계 노드로 가는 연결
  3. 출력 그룹 jj를 번호가 커지는 순서로, 입력 블록 kk를 번호가 커지는 순서로 보면서, (블록 kk, 그룹 jj가 속한 블록) 쌍의 중계 노드에서 그룹 jj의 나누는 노드로 가는 연결
  4. 출력 그룹 jj를 번호가 커지는 순서로, 그 그룹에 속한 출력 노드 yy를 번호가 커지는 순서로 보면서, 그룹 jj의 나누는 노드에서 yy로 가는 연결

이 라우터는 Ntot=2N+2S+B2N_{tot} = 2N + 2S + B^2, M=2N+2SBM = 2N + 2SB다.

첫째 줄에 NtotN_{tot}MM을 공백으로 구분해 출력한다. 다음 MM개의 줄에는 직접 연결 하나마다 두 정수 XXYY를 공백으로 구분해 출력한다. 노드 XX에서 노드 YY로 가는 직접 연결을 뜻하고, 순서는 위에서 정한 대로다.