์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 1351 ๐Ÿฅ‡] ๋ฌดํ•œ ์ˆ˜์—ด

1eehyunji 2023. 8. 21. 22:33

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 ≤ 1012
  • 2 ≤ P, Q ≤ 109
 
 

๋ฌธ์ œํ’€์ด

import sys

n,p,q=map(int, sys.stdin.readline().split(' '))
# A=[0]*(n+1)
# A[0]=1
# for i in range(1,n+1):
#     A[i]=A[i//p]+A[i//q]

A={}
A[0]=1
def recursion_find_An(num):
    if num in A.keys():
        return A[num]
    A[num]=recursion_find_An(num//p)+recursion_find_An(num//q)
    return A[num]

recursion_find_An(n)
print(A[n])
  • ๋‹จ์ˆœํžˆ A[n]์„ ๊ตฌํ•  ๋•Œ๊นŒ์ง€ ์ด์ „ ๊ฐ’์„ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ๋‹น์—ฐํžˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.(n์ด ์ตœ๋Œ€ 10^12..)
  • ๊ทธ๋ž˜์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ n ์ด์ „์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ๊ตฌํ•˜์ง€ ์•Š๊ณ , A[n]์„ ๊ตฌํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ์ˆ˜๋“ค๋งŒ ๊ตฌํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ A[n]์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ A๋ผ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ, ํ•ด๋‹น ์ˆ˜๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ์˜ key์— ์กด์žฌํ•  ๊ฒฝ์šฐ, ์ฆ‰, ํ•ด๋‹น ์ˆ˜์˜ A๊ฐ’์ด ๊ณ„์‚ฐ๋˜์–ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€์„œ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
  • ๋ฌธ์ œ์˜ ์˜ˆ์ œ 1๋ฒˆ์œผ๋กœ ์ด ๊ณผ์ •์„ ์„ค๋ช…ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.