변형 피보나치 수열의 행렬 점화식Permalink

다음과 같은 점화식을 보자.

f(n)=Af(n1)+Bf(nk) f(n)=A \cdot f(n-1)+B \cdot f(n-k)

여기서 A=1, B=1, k=2A=1,~B=1,~k=2 라면 일반 피보나치 수열이다.

이 문제를 그냥 푸는것보다 피보나치 수열꼴의 점홧기에 A,B,kA,B,k 값이 달라졌을 때 행렬을 어떻게 구성할 수 있는지 살펴보자.

이 글에선 위와 같은 꼴을 다룰 뿐이지만, 결국 위와 같은 선형 점화식 대한 행렬을 구성함에 있어 이해를 돕는다.

이 글에서 다루진 않지만 더 고급 개념인 키타마사법이나 벌레캠프 메시를 이해하는데도 도움이 될 것이다.

일반 피보나치 수열에 쓰이는 행렬을 살펴보자.

(f(n)f(n1))=(1110)(f(n1)f(n2)) \begin{pmatrix} f(n)\\ f(n-1) \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix} \begin{pmatrix} f(n-1) \\ f(n-2) \end{pmatrix}

여기서 A,BA, B 를 추가해보자.

f(n)=Af(n1)+Bf(n2) f(n)=A \cdot f(n-1)+B \cdot f(n-2)

라 하자.

(f(n)f(n1))=(AB10)(f(n1)f(n2)) \begin{pmatrix} f(n)\\ f(n-1) \end{pmatrix} = \begin{pmatrix} A & B \\ 1 & 0 \end{pmatrix} \begin{pmatrix} f(n-1) \\ f(n-2) \end{pmatrix}

단순히 11행의 1,11, 1A,BA, B로 바꾸는 것으로 원하는 결과를 만들었다.

f(nk)f(n-k) 란 값이 등장하기 위해 kkkk열의 행렬이 필요하다는 것을 유추할 수 있다.

결국 최종 점화식은 다음과 같다.

(f(n)f(n1)f(n2)f(nk+2)f(nk+1))=(A00B1000010000000010)(f(n1)f(n2)f(n3)f(nk+1)f(nk)) \begin{pmatrix}f(n) \\ f(n-1) \\ f(n-2)\\ \vdots \\ f(n-k+2) \\ f(n-k+1)\end{pmatrix} = \begin{pmatrix}A & 0 & \cdots & 0 & B \\ 1 & 0 & \cdots & 0 & 0 \\ 0 & 1 & \cdots & 0 & 0 \\ &&\vdots \\ 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cdots & 1 & 0 \end{pmatrix} \begin{pmatrix} f(n-1) \\ f(n-2) \\ f(n-3) \\ \vdots \\ f(n-k+1) \\ f(n-k) \end{pmatrix}

이런식으로 행렬을 구성하면 O(k3logn)O(k^3 \log n) 에 문제를 해결할 수 있다.

연습 문제Permalink

BOJ 17272 - 리그 오브 레전설 (Large)

f(n)=f(n1)+f(nk) f(n)=f(n-1)+f(n-k)

를 구하는 문제이다.

Comments