힐베르트 곡선
시간 제한1초메모리 제한128 MB
주어진 수평 선분과 n번째 힐베르트 곡선이 만나는 점의 개수를 구한다. 선분의 끝점은 1/2^n의 배수다.
문제
힐베르트 곡선은 독일 수학자 다비트 힐베르트가 처음 소개한, 연속이면서 공간을 가득 채우는 프랙탈 곡선이다.
이 곡선은 가로 선분과 세로 선분으로 이루어진 곡선의 수열 로 정의한다. 각 곡선은 단위 정사각형 안에 놓인다.
은 네 점 , , , 을 차례로 잇는 세 선분으로 이루어진다.
은 로부터 다음 네 단계를 거쳐 재귀적으로 만든다.
- 의 모든 좌표를 절반으로 줄인다.
- 그 곡선을 점 을 중심으로 반시계 방향으로 돌린 곡선을 추가한다.
- 지금까지 만든 곡선을 직선 에 대하여 대칭시킨 곡선을 추가한다.
- 이라 하자. 각 조각의 끝점들을 세 선분으로 잇는다. 즉, 과 을, 과 을, 과 을 각각 잇는다.
수평 선분이 주어졌을 때, 이 곡선과 만나는 교점의 개수를 구하는 프로그램을 작성하라. 예를 들어 과 수평 선분 – 은 개의 점에서 만나고, 와 수평 선분 – 은 개의 점에서 만난다.
의 꼭짓점 좌표는 항상 의 홀수 배수이고, 수평 선분 끝점의 좌표는 항상 의 배수이다. 따라서 수평 선분은 항상 의 세로 선분 부분과만 만난다.
입력
입력은 여러 개의 데이터(테스트 케이스)로 이루어지며, 데이터는 최대 개이다.
각 데이터는 공백으로 구분된 네 정수 , , , 로 주어진다. 이는 곡선 과 수평 선분 – 을 나타낸다. , 이며, , , 는 모두 범위의 정수이다.
마지막 데이터 다음 줄에는 이 하나 주어지며, 이는 입력의 끝을 뜻한다.
출력
각 데이터에 대하여 곡선 과 주어진 수평 선분이 만나는 교점의 개수를 한 줄에 하나씩 출력한다.