PS/BOJ

[백준] 10452 : 피보나치 인버스

bconfiden2 2021. 2. 11. 10:23

www.acmicpc.net/problem/10425

 

10425번: 피보나치 인버스

첫 번째 줄에 테스트케이스를 나타내는 T(1 ≤ T ≤ 100)가 입력으로 주어진다. 두 번째 줄부터 각 테스트케이스마다 양의 정수 Fn이 입력으로 주어진다. (1 ≤ Fn ≤ 1021000, 1 ≤ N ≤ 100,000)

www.acmicpc.net


  • 피보나치값의 범위가 10의 21000 승이므로 단순한 자료형으로는 절대 풀 수 없다.
  • 원래는 자릿수와 가장 큰 자리의 값을 키로 하려고 했지만, 뒤의 x 자리를 키로 하는게 더 계산하기가 편했다.
  • 딕셔너리와 문자열 슬라이싱 등을 사용하는데 파이썬이 너무 좋은 것 같다.
  • 다른 사람들 풀이를 보니 파이썬의 경우 굳이 20자리만 볼 것이 아니라 전체 값을 해도 되는 듯 하다.
  • 물론 정수 자료형의 범위가 무한대이긴 해도 진짜 가능할 줄은 몰랐는데...

import sys

T = input()

fib = {}
fib[0] = bef2 = 0
fib[1] = bef1 = 1

for i in range(2, 100001):
    val = str(bef2 + bef1)[-21:]    # n 번째 피보나치의 마지막 20자리를 키로 해서
    fib[val] = i                    # n 을 값으로 넣음
    bef2 = bef1                     # 다음 피보나치 업데이트
    bef1 = int(val)

for line in sys.stdin:
    print(fib[line.strip()[-21:]])  # 입력받은 피보나치값의 마지막 20자리로 n 을 구함