아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

자라나는 직교 나선

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

요약
각 구간 길이가 직전보다 1 이상씩 길어지는 직교 나선이 정확히 (x, y)에서 끝나게 되는지 판단하고 전체 길이가 가장 작은 경우를 출력합니다.
난이도

어려움10점 중 9점

유형
수학, 정수론, 백트래킹
정답자
아직 제출이 없습니다

문제

자라나는 직교 나선은 원점에서 출발해 방향을 바꾸며 이어지는 선이다. 첫 부분은 오른쪽(양의 xx축 방향)으로 자라고, 두 번째 부분은 위(양의 yy축 방향), 세 번째 부분은 왼쪽(음의 xx축 방향), 네 번째 부분은 아래(음의 yy축 방향)로 자란다. 다섯 번째 부분부터는 오른쪽, 위, 왼쪽, 아래의 순서를 그대로 반복한다.

각 부분의 길이는 자연수이고, 바로 이전 부분의 길이보다 1 이상 커야 한다. 첫 부분의 길이는 1 이상인 자연수 중 아무 값이나 쓸 수 있다. 아래 그림은 부분의 길이를 1, 2, 4, 6, 7, 9, 11, 12, 15, 20으로 잡은 나선이다.

제1사분면의 점 (x,y)(x, y)가 주어진다. 나선이 자라나 마지막 부분의 끝점이 정확히 (x,y)(x, y)가 되게 할 수 있는지 판정한다. 점을 지나가기만 하면 도달로 보지 않고, 마지막 부분이 그 점에서 끝나야 한다. 도달할 수 있으면 부분 길이의 총합이 가장 작은 방법을 구한다.

입력

첫 줄에 테스트 케이스의 개수 PP가 주어진다. (1≤P≤10001 \le P \le 1000)

이어지는 PP개의 줄에 테스트 케이스가 하나씩 주어진다. 각 줄에는 테스트 케이스의 번호 TT와 점의 좌표 xx, yy가 공백으로 구분되어 주어진다. (1≤x≤100001 \le x \le 10000, 1≤y≤100001 \le y \le 10000)

출력

테스트 케이스마다 한 줄을 출력한다. 줄의 처음에는 입력으로 받은 테스트 케이스의 번호 TT를 적는다.

어떻게 자라나도 끝점이 (x,y)(x, y)가 될 수 없으면 TT 뒤에 NO PATH를 적는다.

도달할 수 있으면 TT 뒤에 총합이 최소인 방법의 부분 개수를 적고, 이어서 각 부분의 길이를 자란 순서대로 적는다. 총합이 최소인 방법은 항상 하나뿐이므로 답도 하나로 정해진다. 모든 값은 공백 하나로 구분한다.

끝점에 도달할 수 있는 테스트 케이스에서는 22개 이하의 부분으로 도달할 수 있다.

예제3

  1. 예제 1

    입력
    3
    1 1 1
    2 3 5
    3 8 4
    
    예상 출력
    1 NO PATH
    2 2 3 5
    3 6 1 2 3 9 10 11
    
  2. 예제 2

    입력
    8
    1 1 1
    2 2 1
    3 2 2
    4 2 3
    5 3 3
    6 3 4
    7 10000 3
    8 10000 4
    
    예상 출력
    1 NO PATH
    2 NO PATH
    3 NO PATH
    4 2 2 3
    5 NO PATH
    6 2 3 4
    7 NO PATH
    8 6 1 2 3 10001 10002 10003
    
  3. 예제 3

    입력
    5
    1 1 2
    2 2 3
    3 3 4
    4 1 10000
    5 9999 10000
    
    예상 출력
    1 2 1 2
    2 2 2 3
    3 2 3 4
    4 2 1 10000
    5 2 9999 10000