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

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

최적 프로그램

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

요약
각 입력/출력 쌍에 대해 ADD, SUB, MUL, DIV, DUP만 사용하는 스택 기계 프로그램 중 10개 이하 명령으로 함수를 계산하는 가장 짧은 프로그램을 찾는다.
난이도

어려움10점 중 8점

유형
완전 탐색, DFS, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

빠른 프로그램을 작성하는 일은 종종 결코 쉽지 않고, 때로는 속도가 정말 중요합니다. 운영체제나 데이터베이스 같은 대규모 시스템에는 수십억 번씩 실행되며 전체 실행 시간의 많은 부분을 차지하는 짧은 "병목" 코드 구간이 있습니다. 이런 구간을 어셈블리로 다시 작성하면 큰 이득을 볼 수 있으므로, 여기서는 최적의 어셈블리 코드를 자동으로 생성하는 문제를 생각합니다. 함수가 입력/출력 쌍으로 주어질 때, 그 함수를 계산하는 가장 짧은 프로그램을 구하세요.

프로그램은 스택 기계 위에서 실행되며, 명령은 정확히 다섯 가지입니다: ADD, SUB, MUL, DIV, DUP.

스택의 맨 위에서 두 번째 원소를 aa, 맨 위 원소를 bb라고 합시다. 네 개의 산술 명령은 이 두 원소를 모두 꺼낸 뒤 결과 하나를 넣습니다.

  • ADD는 a+ba + b를 넣습니다.
  • SUB는 a−ba - b를 넣습니다.
  • MUL은 a×ba \times b를 넣습니다.
  • DIV는 정수 몫 a/ba / b를 넣으며, 몫은 0 방향으로 버림합니다 (예: −7/2=−3-7 / 2 = -3).

DUP은 현재 맨 위 원소의 복사본을 하나 더 넣습니다.

실행을 시작할 때 스택에는 정수 하나, 즉 입력만 들어 있습니다. 실행이 끝났을 때에도 스택에는 정수 하나만 남아 있어야 하며, 그 값이 계산 결과입니다.

다음 중 하나라도 발생하면 기계는 오류 상태에 빠집니다.

  • 맨 위 원소가 00인 상태에서 DIV를 실행한 경우
  • 스택에 원소가 두 개 미만일 때 ADD, SUB, MUL, DIV 중 하나를 실행한 경우
  • 어떤 연산의 결과가 절댓값으로 3000030000을 넘는 경우

입력

입력은 여러 개의 함수 설명으로 이루어집니다. 각 설명의 첫 줄에는 입력/출력 쌍의 개수 nn (n≤10n \le 10)이 주어집니다. 이어지는 두 줄에는 각각 정수 nn개가 주어지는데, 첫 줄은 x1,x2,…,xnx_1, x_2, \ldots, x_n (모두 서로 다름), 둘째 줄은 y1,y2,…,yny_1, y_2, \ldots, y_n입니다. 모든 수의 절댓값은 3000030000 이하입니다.

첫 줄이 n=0n = 0인 설명이 나오면 입력이 끝나며, 이 설명은 처리하지 않습니다.

출력

각 설명에 대해, 모든 i∈{1,…,n}i \in \{1, \ldots, n\}에 대하여 f(xi)=yif(x_i) = y_i를 만족하는 함수 ff를 계산하는 가장 짧은 프로그램을 찾으세요. 이 프로그램은 입력 xix_i들에 대해 실행할 때 오류 상태에 빠져서는 안 됩니다 (다른 입력에 대해서는 오류가 나도 됩니다). 명령이 최대 1010개인 프로그램만 고려합니다.

각 설명마다 먼저 Program k 줄을 출력합니다 (여기서 kk는 1부터 시작하는 설명 번호). 그 다음 가장 짧은 프로그램을 명령들 사이를 공백 하나로 구분하여 출력합니다. 가장 짧은 프로그램이 여러 개이면 사전순으로 가장 앞선 것을 출력하며, 명령 토큰의 대소는 ADD < DIV < DUP < MUL < SUB 순서로 비교합니다. 명령이 1010개 이하인 프로그램으로 함수를 계산할 수 없으면 Impossible을 출력합니다. 가장 짧은 프로그램의 명령이 00개이면 Empty sequence를 출력합니다. 서로 이웃한 설명 사이에는 빈 줄을 하나 출력합니다.

예제4

  1. 예제 1

    입력
    4
    1 2 3 4
    0 -2 -6 -12
    3
    1 2 3
    1 11 1998
    1
    1998
    1998
    0
    
    예상 출력
    Program 1
    DUP DUP MUL SUB
    
    Program 2
    Impossible
    
    Program 3
    Empty sequence
    
  2. 예제 2

    입력
    3
    2 3 4
    4 9 16
    0
    
    예상 출력
    Program 1
    DUP MUL
    
  3. 예제 3

    입력
    3
    1 2 3
    2 4 6
    0
    
    예상 출력
    Program 1
    DUP ADD
    
  4. 예제 4

    입력
    3
    5 -3 10
    5 -3 10
    0
    
    예상 출력
    Program 1
    Empty sequence