즉석 복잡도 분석
시간 제한1초메모리 제한128 MB
중첩 루프로 이루어진 작은 프로그램을 해석해 n에 대한 다항식으로 수행 시간을 계산하고, 차수가 높은 항부터 모아서 출력한다.
문제
알고리즘의 수행 시간 복잡도를 분석하는 것은 효율적인 프로그램을 설계하는 데 꼭 필요한 도구이다. 같은 작업에 대해 선형 시간에 동작하는 알고리즘은 보통 이차 시간이 걸리는 알고리즘보다 훨씬 빠르므로 더 선호된다.
수행 시간은 보통 입력의 크기 에 대한 식으로 나타낸다. 여기서 은 정렬할 원소의 개수, 다각형의 꼭짓점의 개수 등이 될 수 있다. 수행 시간을 에 대한 식으로 구하는 것은 일반적으로 쉬운 일이 아니므로 이를 자동화할 수 있다면 좋을 것이다. 일반적으로는 불가능하지만, 이 문제에서는 자동화가 가능한 매우 단순한 형태의 프로그램만 다룬다. 프로그램은 아래 BNF 문법을 따르며, < number > 는 임의의 음이 아닌 정수이다:
< Program > ::= "BEGIN" < Statementlist > "END"
< Statementlist > ::= < Statement > | < Statement > < Statementlist >
< Statement > ::= < LOOP-Statement > | < OP-Statement >
< LOOP-Statement > ::= < LOOP-Header > < Statementlist > "END"
< LOOP-Header > ::= "LOOP" < number > | "LOOP n"
< OP-Statement > ::= "OP" < number >
이러한 프로그램의 수행 시간은 다음과 같이 계산한다. OP 문을 실행하는 데에는 그 매개변수 값만큼의 시간 단위가 든다. LOOP 문이 감싸는 문 목록은 루프의 매개변수가 가리키는 횟수만큼 실행된다. 즉 숫자가 주어지면 그 상수 횟수만큼, n 이 주어지면 번 실행된다. 문 목록의 수행 시간은 그 구성 요소들의 수행 시간의 합이다. 따라서 전체 수행 시간은 일반적으로 에 의존한다.
입력
첫 줄에는 프로그램의 개수 가 주어진다. 그 뒤에 위 문법을 따르는 개의 프로그램이 이어진다. 공백과 줄바꿈은 프로그램 안 어디에나 나타날 수 있지만, 키워드 BEGIN, END, LOOP, OP 내부나 정수 값 내부에는 나타나지 않는다. LOOP 연산자의 중첩 깊이는 최대 이다.
출력
각 프로그램에 대해 먼저 Program #i 줄을 출력한다. 여기서 는 부터 시작하는 프로그램 번호이다. 그다음 수행 시간을 에 대한 다항식으로 출력한다. 이 다항식의 차수는 최대 이다. 다음 형식으로 출력한다:
Runtime = a*n^10+b*n^9+...+i*n^2+j*n+k
동류항을 모은 뒤 차수가 높은 항부터 낮은 항 순서로 나열하고, 각 항을 공백 없이 + 로 이어 붙인다. 계수가 인 항은 생략하며, 계수가 인 경우 계수를 쓰지 않는다 (1*n^2 가 아니라 n^2, 1*n 이 아니라 n). 차수가 인 항은 n^1 이 아니라 n 으로 쓰며, 상수항은 그 값이 이더라도 항상 그 값을 그대로 출력한다. 전체 수행 시간이 이면 Runtime = 0 을 출력한다.
연속된 두 프로그램의 출력 사이에는 빈 줄을 하나 출력한다.