힐베르트 곡선

시간 제한1초메모리 제한128 MB

요약
주어진 수평 선분과 n번째 힐베르트 곡선이 만나는 점의 개수를 구한다. 선분의 끝점은 1/2^n의 배수다.
난이도

어려움10점 중 8점

유형
재귀, 분할 정복, 기하, 구현
정답자
아직 제출이 없습니다

문제

힐베르트 곡선은 독일 수학자 다비트 힐베르트가 처음 소개한, 연속이면서 공간을 가득 채우는 프랙탈 곡선이다.

이 곡선은 가로 선분과 세로 선분으로 이루어진 곡선의 수열 H1,H2,H3,…H_1, H_2, H_3, \dots 로 정의한다. 각 곡선은 단위 정사각형 [0,1]×[0,1][0, 1] \times [0, 1] 안에 놓인다.

H1H_1 은 네 점 (14,34)(\frac{1}{4}, \frac{3}{4}), (14,14)(\frac{1}{4}, \frac{1}{4}), (34,14)(\frac{3}{4}, \frac{1}{4}), (34,34)(\frac{3}{4}, \frac{3}{4}) 을 차례로 잇는 세 선분으로 이루어진다.

HnH_n 은 Hn−1H_{n-1} 로부터 다음 네 단계를 거쳐 재귀적으로 만든다.

  1. Hn−1H_{n-1} 의 모든 좌표를 절반으로 줄인다.
  2. 그 곡선을 점 (0,12)(0, \frac{1}{2}) 을 중심으로 반시계 방향으로 90∘90^\circ 돌린 곡선을 추가한다.
  3. 지금까지 만든 곡선을 직선 x=12x = \frac{1}{2} 에 대하여 대칭시킨 곡선을 추가한다.
  4. m=12n+1m = \frac{1}{2^{n+1}} 이라 하자. 각 조각의 끝점들을 세 선분으로 잇는다. 즉, (12−m,12−m)(\frac{1}{2} - m, \frac{1}{2} - m) 과 (12+m,12−m)(\frac{1}{2} + m, \frac{1}{2} - m) 을, (m,12−m)(m, \frac{1}{2} - m) 과 (m,12+m)(m, \frac{1}{2} + m) 을, (1−m,12−m)(1 - m, \frac{1}{2} - m) 과 (1−m,12+m)(1 - m, \frac{1}{2} + m) 을 각각 잇는다.

수평 선분이 주어졌을 때, 이 곡선과 만나는 교점의 개수를 구하는 프로그램을 작성하라. 예를 들어 H3H_3 과 수평 선분 (28,78)(\frac{2}{8}, \frac{7}{8})–(78,78)(\frac{7}{8}, \frac{7}{8}) 은 33 개의 점에서 만나고, H4H_4 와 수평 선분 (016,116)(\frac{0}{16}, \frac{1}{16})–(1616,116)(\frac{16}{16}, \frac{1}{16}) 은 1616 개의 점에서 만난다.

HnH_n 의 꼭짓점 좌표는 항상 12n+1\frac{1}{2^{n+1}} 의 홀수 배수이고, 수평 선분 끝점의 좌표는 항상 12n\frac{1}{2^{n}} 의 배수이다. 따라서 수평 선분은 항상 HnH_n 의 세로 선분 부분과만 만난다.

입력

입력은 여러 개의 데이터(테스트 케이스)로 이루어지며, 데이터는 최대 100100 개이다.

각 데이터는 공백으로 구분된 네 정수 nn, x1x_1, x2x_2, yy 로 주어진다. 이는 곡선 HnH_n 과 수평 선분 (x12n,y2n)(\frac{x_1}{2^n}, \frac{y}{2^n})–(x22n,y2n)(\frac{x_2}{2^n}, \frac{y}{2^n}) 을 나타낸다. 0<n<310 < n < 31, x1<x2x_1 < x_2 이며, x1x_1, x2x_2, yy 는 모두 [0,2n][0, 2^n] 범위의 정수이다.

마지막 데이터 다음 줄에는 00 이 하나 주어지며, 이는 입력의 끝을 뜻한다.

출력

각 데이터에 대하여 곡선 HnH_n 과 주어진 수평 선분이 만나는 교점의 개수를 한 줄에 하나씩 출력한다.

예제6

  1. 예제 1

    입력
    3 2 7 7
    4 0 16 1
    30 1 1073741823 1
    0
    
    예상 출력
    3
    16
    1073741822
    
  2. 예제 2

    입력
    1 0 2 1
    0
    
    예상 출력
    2
    
  3. 예제 3

    입력
    2 0 4 1
    2 0 4 2
    2 0 4 3
    0
    
    예상 출력
    4
    2
    2
    
  4. 예제 4

    입력
    3 0 8 0
    3 0 8 8
    0
    
    예상 출력
    0
    0
    
  5. 예제 5

    입력
    4 0 16 8
    4 3 5 8
    0
    
    예상 출력
    2
    0
    
  6. 예제 6

    입력
    3 3 4 5
    3 0 1 5
    3 1 3 3
    0
    
    예상 출력
    1
    1
    2