데이터 마이닝

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

Tuple 박사는 어느 상용 상품 회사를 위해 새로운 데이터 마이닝 응용 프로그램을 개발하고 있다. 그중 한 서브루틴은 각각 NN개의 레코드를 담은 두 배열 PPQQ를 다룬다(레코드 번호는 00부터 N1N-1까지이다). 배열 PP는 키로 이루어진 해시 형태의 구조를 담고 있어 레코드를 찾는 데 쓰이며, 해당 레코드의 실제 데이터는 배열 QQ에서 읽어 온다.

배열 PP의 모든 레코드 크기는 SPS_P바이트, 배열 QQ의 모든 레코드 크기는 SQS_Q바이트이다. 이 서브루틴은 프로그램 전체에서 가장 자주 실행되는 부분이므로 최대한 빠르게 동작해야 한다. 그런데 SPS_PSQS_Q는 실행 시점에야 알 수 있어서 여러 컴파일 타임 최적화를 적용할 수 없다.

ii번째 레코드의 바이트 오프셋은 보통 다음과 같이 계산한다.

Pofs(i)=SPi,Qofs(i)=SQi.Pofs(i) = S_P \cdot i, \qquad Qofs(i) = S_Q \cdot i.

최신 프로세서에서 곱셈은 덧셈보다 훨씬 느리다. 그래서 Tuple 박사는 배열 PP를 훑을 때 인덱스 ii 대신 바이트 오프셋 Pofs(i)Pofs(i)를 저장하고, 이웃한 레코드로 이동할 때는 Pofs(i+1)=Pofs(i)+SPPofs(i+1) = Pofs(i) + S_P 또는 Pofs(i1)=Pofs(i)SPPofs(i-1) = Pofs(i) - S_P를 사용한다.

PP에서 레코드를 찾을 때마다 대응하는 QQ의 레코드를 읽어야 하며, 이를 위해 오프셋 Qofs(i)Qofs(i)가 필요하다. 위 두 식으로부터 다음을 얻는다.

Qofs(i)=Pofs(i)/SPSQ.Qofs(i) = Pofs(i) / S_P \cdot S_Q.

이 식에는 곱셈뿐 아니라 (느린) 정수 나눗셈이 들어 있다. 이를 피하기 위해 Tuple 박사는 다음의 빠른 식을 사용한다.

Qofs(i)=(Pofs(i)+(Pofs(i)A))B,Qofs'(i) = \big(Pofs(i) + (Pofs(i) \ll A)\big) \gg B,

여기서 AABB는 음이 아닌 정수이고, xAx \ll AAA비트 왼쪽 시프트(즉 x2Ax \cdot 2^A), xBx \gg BBB비트 오른쪽 시프트(즉 x/2B\lfloor x / 2^B \rfloor)를 뜻한다. 레지스터는 충분히 넓어서 오버플로는 절대 일어나지 않는다고 가정한다. Pofs(i)=SPiPofs(i) = S_P \cdot i이므로 이 식은 다음과 같다.

Qofs(i)=SP(1+2A)i2B.Qofs'(i) = \left\lfloor \frac{S_P \cdot (1 + 2^A) \cdot i}{2^B} \right\rfloor.

대부분의 AA, BB 선택에서는 이 값이 Qofs(i)Qofs(i)와 같지 않지만, 메모리를 조금 더 쓰면 여전히 사용할 수 있다. QQ를 일반적인 방식으로 배치하면 NSQN \cdot S_Q바이트가 필요하다. Tuple 박사는 항상 적절한 KK(KNSQK \ge N \cdot S_Q)를 고를 수 있는데, QQKK바이트를 할당하고 AA, BB를 잘 선택하면 빠른 식이 NN개의 레코드를 서로 겹치지 않게 저장한다. 즉 레코드 ii는 바이트 구간 [Qofs(i), Qofs(i)+SQ)[Qofs'(i),\ Qofs'(i) + S_Q)를 차지하고, NN개의 구간은 서로 겹치지 않으며, 모두 [0,K)[0, K) 안에 들어간다.

최소의 KK와 그에 해당하는 AA, BB를 찾는 프로그램을 작성하라. 같은 최소 KK를 주는 (A,B)(A, B) 쌍이 여러 개라면 AA가 가장 작은 것을, 그래도 여러 개라면 BB가 가장 작은 것을 출력한다.

입력

공백으로 구분된 세 정수 NN, SPS_P, SQS_Q가 주어진다 (1N2201 \le N \le 2^{20}, 1SP2101 \le S_P \le 2^{10}, 1SQ2101 \le S_Q \le 2^{10}).

출력

공백으로 구분된 세 정수 KK, AA, BB를 한 줄에 출력한다.