꾸꾸리

[BOJ/Python] 1351_무한 수열 본문

Algorithm/BOJ

[BOJ/Python] 1351_무한 수열

O773H 2023. 1. 11. 13:38
728x90

문제 출처:https://www.acmicpc.net/problem/1351

 

1351번: 무한 수열

첫째 줄에 3개의 정수 N, P, Q가 주어진다.

www.acmicpc.net

문제

무한 수열 A는 다음과 같다.

  • A0 = 1
  • Ai = A⌊i/P⌋ + A⌊i/Q⌋ (i ≥ 1)

N, P와 Q가 주어질 때, AN을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 3개의 정수 N, P, Q가 주어진다.

출력

첫째 줄에 AN을 출력한다.

제한

  • 0 ≤ N ≤ 10^12
  • 2 ≤ P, Q ≤ 10^9

예제 입력 1

7 2 3

예제 출력 1

7

예제 입력 2

0 2 3

예제 출력 2

1

예제 입력 3

10000000 3 3

예제 출력 3

32768

예제 입력 4

256 2 4

예제 출력 4

89

예제 입력 5

1 1000000 1000000

예제 출력 5

2

힌트

⌊x⌋는 x를 넘지 않는 가장 큰 정수이다.

 


풀이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys
 
n,p,q = map(int,sys.stdin.readline().split())
 
n_dict = {0:1}
 
def find(num):
    if num not in n_dict:
        n_dict[num] = find(num//p) + find(num//q)
    
    return n_dict[num]
    
print(find(n))
cs

 

  1. 딕셔너리 자료형을 이용한다. A0 = 1이므로, n_dict[0] = 1인 딕셔너리를 생성한다.
  2. 함수 find의 경우, 만약 찾는 값이 n_dict에 존재한다면 그 값을 반환한다.
  3. 존재하지 않는다면, 재귀를 이용하여 값을 찾아 그 값을 반환한다.
  • 만약 딕셔너리를 이용하지 않고, 리스트를 이용한다면 n의 범위가 최대 10^12까지이므로, 리스트의 크기가 최대 10^12까지 생성되므로 적합하지 않다.
  • num//p의 경우 num을 p로 나눈 몫을 반환하는데, ⌊x⌋는 x를 넘지 않는 가장 큰 정수이므로 같은 값을 가진다.

 

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ/Python] 5430_AC  (0) 2023.01.12
[BOJ/Python] 20055_컨베이어 벨트 위의 로봇  (0) 2023.01.12
[BOJ/Python] 14719_빗물  (0) 2023.01.10
[BOJ/Python] 15686_치킨 배달  (1) 2023.01.09
[BOJ/Python] 1759_암호 만들기  (0) 2023.01.08