반응형
문제
https://www.acmicpc.net/problem/2749
n의 크기가 무지막지하다.주어진 n의 크기는 0의 숫자 조차 세기 힘들다.
메모이제이션은 O(n)이라는 시간이 걸린다. 보통의 풀이방식으로는 불가능하다
피보나치 수열을 분할정복으로 풀 수 있는 방법이 있다는건데 찾아봐야겟다...
https://www.acmicpc.net/blog/view/28
행렬을 통해 피보나치수열을 구할수 있다는것과 일반항으로도 표현할수 있다는것에
놀랐다. 굉장히 많은것을 배울수 있었다.
앞서 사용했던 행렬의 제곱을 이용하여 구하였다.
다음에기회가 된다면 일반항을 통해 구현해 봐야겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | def fibo_matric(A,n): if n==1: for i in range(2): for j in range(2): A[i][j]%=1000000 return A elif n%2==1: tmp = [[0, 0], [0, 0]] B=fibo_matric(A,n-1) for i in range(2): for j in range(2): for k in range(2): tmp[i][j] += B[i][k] * A[k][j] tmp[i][j] %= 1000000 return tmp else: tmp = [[0, 0], [0, 0]] B = fibo_matric(A, n//2) for i in range(2): for j in range(2): for k in range(2): tmp[i][j] += B[i][k] * B[k][j] tmp[i][j] %= 1000000 return tmp n=int(input()) A=[[1,1],[1,0]] if n==0: print(0) elif n==1: print(1) else: print(fibo_matric(A,n-1)[0][0]) | cs |
반응형
'알고리즘(python) > 기본' 카테고리의 다른 글
[Python]동적계획법2 백준 11066 (0) | 2020.02.05 |
---|---|
[Python]동적계획법2 백준 2293 (0) | 2020.02.04 |
[Python]분할정복 백준 10830 (0) | 2020.01.29 |
[Python]분할정복 백준 2740 (0) | 2020.01.28 |
[Python]분할정복 백준 1629 (0) | 2020.01.26 |
최근댓글