벡터에는 방향이 있고, 두 벡터 사이에는 사잇각이 하나 정해진다. 3차원 벡터의 집합이 주어질 때, 그중 사잇각이 가장 작은 두 벡터를 찾는 프로그램을 작성하시오.
입력은 여러 개의 데이터 집합으로 이루어진다. 한 데이터 집합은 3차원 벡터의 집합 하나를 정하는데, 일부 벡터는 입력에 그대로 적혀 있고 나머지는 아래 절차로 만든다.
각 데이터 집합의 형식은 다음과 같다.
m n S W
x1 y1 z1
x2 y2 z2
.
.
.
xm ym zm
첫 줄에 네 정수 m, n, S, W가 주어진다.
m은 세 성분이 입력에 직접 적힌 벡터의 개수다. 둘째 줄부터 m개의 줄에 그 벡터의 세 성분이 주어지며, 그중 i번째 줄은 벡터 vi=(xi,yi,zi)를 뜻한다. 모든 성분은 100 이하의 양의 정수다.
n은 다음 절차로 만드는 벡터의 개수다.
int g = S;
for (int i = m + 1; i <= m + n; i++) {
x[i] = (g / 7) % 100 + 1;
y[i] = (g / 700) % 100 + 1;
z[i] = (g / 70000) % 100 + 1;
if (g % 2 == 0) { g = (g / 2); }
else { g = (g / 2) ^ W; }
}
i=m+1,…,m+n에 대해 집합의 i번째 벡터 vi의 세 성분은 이 절차가 정한 x[i], y[i], z[i]다.
S와 W는 데이터 집합의 첫 줄에 주어진 값이고, 1≤S≤109, 1≤W≤109이다.
벡터의 총 개수는 2≤m+n≤12×104를 만족한다. 한 데이터 집합 안에서 똑같은 벡터가 두 번 이상 주어질 수도 있다.
0 네 개가 적힌 줄은 입력의 끝을 뜻한다. 입력에 들어 있는 모든 데이터 집합의 m+n을 더한 값은 16×105을 넘지 않는다.
각 데이터 집합마다, 주어진 집합에서 사잇각이 0이 아니면서 가장 작은 두 벡터를 한 줄에 출력한다. 방향이 서로 다른 벡터가 적어도 두 개 있다.
벡터는 세 성분으로 나타낸다. 두 벡터 va와 vb의 쌍은 다음 형식으로 출력한다.
xa ya za xb yb zb
두 벡터 (xa,ya,za)와 (xb,yb,zb)는 사전순으로 비교한다. 즉 xa<xb이거나, xa=xb이고 ya<yb이거나, xa=xb, ya=yb이고 za<zb이면 va<vb다. 쌍을 출력할 때는 이 순서로 더 작은 벡터를 먼저 쓴다.
사잇각이 가장 작은 쌍이 둘 이상이면, 쌍끼리 사전순으로 비교해 가장 작은 쌍을 출력한다. 쌍 (vi,vj)가 쌍 (vk,vl)보다 작다는 것은 vi<vk이거나, vi=vk이고 vj<vl인 경우를 뜻한다.