데이터 마이닝
시간 제한1초메모리 제한128 MB
음이 아닌 시프트 A와 B를 정해 Q의 오프셋 계산식이 크기 S_Q인 레코드 N개를 겹치지 않게 배치하도록 하고, 필요한 K를 최소로 한 뒤 A와 B 순으로 작게 정한다.
문제
Tuple 박사는 어느 상용 상품 회사를 위해 새로운 데이터 마이닝 응용 프로그램을 개발하고 있다. 그중 한 서브루틴은 각각 개의 레코드를 담은 두 배열 와 를 다룬다(레코드 번호는 부터 까지이다). 배열 는 키로 이루어진 해시 형태의 구조를 담고 있어 레코드를 찾는 데 쓰이며, 해당 레코드의 실제 데이터는 배열 에서 읽어 온다.
배열 의 모든 레코드 크기는 바이트, 배열 의 모든 레코드 크기는 바이트이다. 이 서브루틴은 프로그램 전체에서 가장 자주 실행되는 부분이므로 최대한 빠르게 동작해야 한다. 그런데 와 는 실행 시점에야 알 수 있어서 여러 컴파일 타임 최적화를 적용할 수 없다.
번째 레코드의 바이트 오프셋은 보통 다음과 같이 계산한다.
최신 프로세서에서 곱셈은 덧셈보다 훨씬 느리다. 그래서 Tuple 박사는 배열 를 훑을 때 인덱스 대신 바이트 오프셋 를 저장하고, 이웃한 레코드로 이동할 때는 또는 를 사용한다.
에서 레코드를 찾을 때마다 대응하는 의 레코드를 읽어야 하며, 이를 위해 오프셋 가 필요하다. 위 두 식으로부터 다음을 얻는다.
이 식에는 곱셈뿐 아니라 (느린) 정수 나눗셈이 들어 있다. 이를 피하기 위해 Tuple 박사는 다음의 빠른 식을 사용한다.
여기서 와 는 음이 아닌 정수이고, 는 비트 왼쪽 시프트(즉 ), 는 비트 오른쪽 시프트(즉 )를 뜻한다. 레지스터는 충분히 넓어서 오버플로는 절대 일어나지 않는다고 가정한다. 이므로 이 식은 다음과 같다.
대부분의 , 선택에서는 이 값이 와 같지 않지만, 메모리를 조금 더 쓰면 여전히 사용할 수 있다. 를 일반적인 방식으로 배치하면 바이트가 필요하다. Tuple 박사는 항상 적절한 ()를 고를 수 있는데, 에 바이트를 할당하고 , 를 잘 선택하면 빠른 식이 개의 레코드를 서로 겹치지 않게 저장한다. 즉 레코드 는 바이트 구간 를 차지하고, 개의 구간은 서로 겹치지 않으며, 모두 안에 들어간다.
최소의 와 그에 해당하는 , 를 찾는 프로그램을 작성하라. 같은 최소 를 주는 쌍이 여러 개라면 가 가장 작은 것을, 그래도 여러 개라면 가 가장 작은 것을 출력한다.
입력
공백으로 구분된 세 정수 , , 가 주어진다 (, , ).
출력
공백으로 구분된 세 정수 , , 를 한 줄에 출력한다.