피보나치 수 분석
시간 제한1초메모리 제한128 MB
16진수로 주어진 lo-hi 구간마다 구간에 들어가는 피보나치 수를 인덱스, 밑이 2인 로그, 소인수분해와 함께 출력한다.
문제
피보나치 수 F(n)은 다음과 같이 재귀적으로 정의된다.
정수 구간 [lo, hi]가 주어질 때, 이 구간(양 끝 포함)에 들어가는 모든 피보나치 수를 찾아 각각에 대해 다음 정보를 출력한다.
- 피보나치 수의 인덱스 n과 값 F(n)
- 그 값의 밑이 2인 로그 lg (소수점 여섯째 자리까지)
- 그 값의 소인수분해 (오름차순, 중복된 소인수는 나타나는 횟수만큼 출력)
단, 다음 규칙을 따른다.
- 0은 첫 번째 피보나치 수이지만 0의 로그는 정의되지 않으므로, 로그 대신
lg does not exist를 출력한다. - 0과 1은 소인수가 없으므로, 소인수분해 대신
No prime factors를 출력한다. - 구간에 들어가는 피보나치 수가 하나도 없으면
No Fibonacci numbers in the range를 출력한다.
F(1) = 1과 F(2) = 1처럼 인덱스는 다르지만 값이 같은 피보나치 수는 각각 따로 출력한다.
입력
입력은 여러 개의 구간으로 이루어지며, 각 구간은 한 줄에 음이 아닌 두 정수 lo와 hi로 주어진다. 두 수는 접두사 0x가 붙은 16진수로 표기된다. 예를 들어 0x1a는 26을 뜻한다.
각 정수는 64비트 부호 있는 정수 범위에 속한다. 파일의 끝(EOF)에 도달하거나 어떤 줄에서 lo ≥ hi이면 입력을 종료한다. (종료 조건에 해당하는 줄은 처리하지 않는다.)
출력
처리하는 각 구간마다 먼저 구간을 나타내는 머리글 Range {lo} to {hi}:를 십진수로 출력한다. 이어서 구간에 들어가는 각 피보나치 수에 대해 아래 형식으로 두 줄씩 출력한다.
- 첫째 줄:
Fib({n}) = {값}, lg is {로그}(값이 0이면Fib({n}) = 0, lg does not exist) - 둘째 줄:
Prime factors: {소인수들}(값이 0 또는 1이면No prime factors)
밑이 2인 로그(lg)는 소수점 여섯째 자리까지 출력하고, 소인수는 공백으로 구분한다. 서로 다른 구간의 출력은 빈 줄 하나로 구분한다.