https://www.acmicpc.net/problem/18291
18291번: 비요뜨의 징검다리 건너기
강을 건너는 방법은, (1 → 4), (1 → 2 → 4), (1 → 3 → 4), (1 → 2 → 3 → 4)의 4가지이다.
www.acmicpc.net
문제 접근
분할 정복
1~N까지의 징검다리중 X번째를 밟고 지나갈 수 있다.
(1<=X<=N) 1번과 N번을 제외하고 나머지 징검다리는 모두 밟거나 밟지않는다는 2가지중 1개로 정해진다.
N=2의 결과: 1
N=3의 결과: 2
N=4의 결과: 4
N=5의 결과: 8
N=a의 결과: 2**(a-2)
2의 제곱을 구하는 문제인데, N의 범위가 10^9라서 분할 정복으로 제곱을 해야함.
분할 정복 알고리즘
원리 문제를 부분문제로 분할하고, 분할된 문제들을 해결후에 다시 조합해나가서 결과를 도출하는 알고리즘 https://namu.wiki/w/%EB%B6%84%ED%95%A0%20%EC%A0%95%EB%B3%B5%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98 분할 정
portable-paper.tistory.com
코드
import sys
input = sys.stdin.readline
"""
18291 비요뜨의 징검다리 건너기
"""
D = 10**9+7
def sol(n):
if n==1:
return 2
res = sol(n//2)
if n%2:
return (res*res*2)%D
else:
return(res*res)%D
T = int(input())
for t in range(T):
N = int(input())
if N<3:
print(1)
continue
print(sol(N-2))
30616 | 48 |
'백준 > 문제풀이_python' 카테고리의 다른 글
15686 치킨 배달 (python) (0) | 2023.11.19 |
---|---|
9663 N_Queen (python) (0) | 2023.11.18 |
1238 파티 python (0) | 2023.01.15 |
7662 이중 우선순위 큐 python (0) | 2023.01.13 |
1541 잃어버린 괄호 python (0) | 2023.01.13 |
댓글