https://www.acmicpc.net/problem/2749
• 접근
보통 피보나치 문제를 접근할 때에는 divide and conquer 또는 DP로 접근한다. n이 매우 작은 경우(BOJ 2747 참조)에는 재귀로 풀어도 풀 수 있다. 시간복잡도가 O(2^N)이기 때문이다.
그보다 n이 조금 더 커진다면 DP로 풀 수 있다. 이 경우 time complexity가 O(N)이므로 N이 대략 2억 언저리인 경우까지도 해결이 가능하다.
이 문제는 다르다. n의 upper bound가 1e18이다. 이런 경우에는 O(N)으로 풀 수 없다. O(logN)의 시간복잡도로 풀겠다는 생각을 해야 한다.
• 행렬곱 문제로 치환
이 문제는 행렬곱 문제로 치환할 수 있다. 귀중한 통찰을 얻은 블로그가 있다. 이 문단의 설명은 이 블로그의 글로 갈음한다.
https://egg-money.tistory.com/78
• 구현
나머지는 구현이다. 행렬 제곱의 O(logN) 구현에 대해서는 BOJ 10830 : 행렬 제곱을 참조하면 좋다.
https://www.acmicpc.net/problem/10830
전체 코드는 내 github에서 확인할 수 있다.
https://github.com/Jordano-Jackson/PS/blob/main/BOJ/2749/2749.cpp
'CS > PS' 카테고리의 다른 글
[BOJ] 4386번 : 별자리 만들기 (0) | 2022.07.01 |
---|---|
[BOJ] 9466, 1202, 14003, 2166 (0) | 2021.09.01 |
[BOJ] 2473번 : 세 용액 (0) | 2021.07.31 |
[BOJ] 7578번 : 공장 (0) | 2021.07.29 |
[BOJ] 2517번 : 달리기 (0) | 2021.07.28 |