logseq 20260110
This commit is contained in:
parent
e9bbdd6060
commit
9fd4bd6191
@ -90,4 +90,104 @@ deck:: Logseq/coding tip
|
||||
# 홀수면: temp * temp * A
|
||||
return multiply_matrix(multiply_matrix(temp, temp, N), adj, N)
|
||||
|
||||
```
|
||||
```
|
||||
-
|
||||
- ### 2) 피보나치 수열을 행렬로 표현해서 분할정복으로 구하기
|
||||
- #### 피보나치 수열의 행렬화
|
||||
- 피보나치 수열의 점화식 $F_n = F_{n-1} + F_{n-2}$를 행렬 곱셈 형태로 변환.
|
||||
- 1) 기본 점화식의 행렬화 #card
|
||||
id:: 69623201-075b-4955-9d5b-aedcbcf16170
|
||||
- $$F_{n+1} = F_n + F_{n-1}$$
|
||||
$$F_n = F_{n-1} + F_{n-2}$$
|
||||
- $$
|
||||
\begin{bmatrix} F_{n+1} \\ F_n \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} F_n \\ F_{n-1} \end{bmatrix}
|
||||
$$
|
||||
- 2) 재귀적으로 쭉 대입하면 최종적으로 다음과 같은 식이 나옴. #card
|
||||
id:: 69622f8c-b595-40fc-83b5-7298ca660f3a
|
||||
- $$
|
||||
\begin{bmatrix} F_{n+1} \\ F_n \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^n \begin{bmatrix} F_1 \\ F_0 \end{bmatrix}
|
||||
$$
|
||||
- $$
|
||||
\begin{bmatrix} F_{n+1} \\ F_n \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^n \begin{bmatrix} 1 \\ 0 \end{bmatrix}
|
||||
$$
|
||||
#+BEGIN_EXTRA
|
||||
즉 $\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^n$ 값의 1행 0열의 값이 $F_n$ 값이 된다.
|
||||
#+END_EXTRA
|
||||
- #### 결론 : $\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^n$ 을 계산하면 n번째 피보나치 수열의 항을 구할 수 있다.
|
||||
- #### 예시문제 : n번째 피보나치 수를 1000000007 로 나눈 나머지를 출력하라.(Python)
|
||||
id:: 6962333f-ebe3-43a9-bca6-96e9442286e1
|
||||
정의할 함수는 mul_mat(m1, m2) 와 power_mat(adj, n) 이다.
|
||||
아래와 같이 코드가 주어질 때 두 함수를 정의하라.
|
||||
```python
|
||||
import sys
|
||||
input = sys.stdin.readline
|
||||
|
||||
# 문제에서 요구하는 나누기 상수
|
||||
MOD = 1_000_000_007
|
||||
|
||||
# 1. 행렬 곱셈 함수 (2x2 고정)
|
||||
def mul_mat(m1, m2):
|
||||
# 행렬 곱
|
||||
|
||||
# 2. 분할 정복을 이용한 거듭제곱
|
||||
def power_mat(adj, n):
|
||||
# 분할정복
|
||||
|
||||
# Main
|
||||
n = int(input())
|
||||
|
||||
# 기본 행렬 [[1, 1], [1, 0]]
|
||||
base_matrix = [[1, 1], [1, 0]]
|
||||
|
||||
# 행렬 제곱 계산
|
||||
result_matrix = power_mat(base_matrix, n)
|
||||
|
||||
# 1행 0열의 값이 n번째 값
|
||||
print(result_matrix[1][0])
|
||||
|
||||
```
|
||||
#card
|
||||
- ```python
|
||||
import sys
|
||||
input = sys.stdin.readline
|
||||
|
||||
# 문제에서 요구하는 나누기 상수
|
||||
MOD = 1_000_000_007
|
||||
|
||||
# 1. 행렬 곱셈 함수 (2x2 고정)
|
||||
def mul_mat(m1, m2):
|
||||
res = [[0]*2 for _ in range(2)]
|
||||
for i in range(2):
|
||||
for j in range(2):
|
||||
for k in range(2):
|
||||
res[i][j] += m1[i][k] * m2[k][j]
|
||||
res[i][j] %= MOD
|
||||
return res
|
||||
|
||||
# 2. 분할 정복을 이용한 거듭제곱
|
||||
def power_mat(adj, n):
|
||||
if n == 1:
|
||||
return [[x % MOD for x in row] for row in adj]
|
||||
|
||||
temp = power_mat(adj, n // 2)
|
||||
|
||||
# 짝수일 때: A^(n//2) * A^(n//2)
|
||||
if n % 2 == 0:
|
||||
return mul_mat(temp, temp)
|
||||
# 홀수일 때: A^(n//2) * A^(n//2) * A
|
||||
else:
|
||||
return mul_mat(mul_mat(temp, temp), adj)
|
||||
|
||||
# Main
|
||||
n = int(input())
|
||||
|
||||
# 기본 행렬 [[1, 1], [1, 0]]
|
||||
base_matrix = [[1, 1], [1, 0]]
|
||||
|
||||
# 행렬 제곱 계산
|
||||
result_matrix = power_mat(base_matrix, n)
|
||||
|
||||
# 1행 0열의 값이 n번째 값
|
||||
print(result_matrix[1][0])
|
||||
|
||||
```
|
||||
@ -51,9 +51,9 @@ deck:: Logseq/영어 문법
|
||||
- **타동사 이외에도 목적어를 가지는 품사 =** {{cloze **전치사**}} #card
|
||||
id:: 6867e92e-f3b8-4cd9-8a33-f3a7089f2230
|
||||
extra:: **전치사 역시 목적어를 가진다.**:
|
||||
- **타동사의 목적어는 동명사/부정사로 경우에 따라 다르지만 선별적으로 들어갈 수 있다. **
|
||||
- 타동사의 목적어는 동명사/부정사로 경우에 따라 다르지만 선별적으로 들어갈 수 있다.
|
||||
id:: 6867e964-d591-4404-9f90-05217908da45
|
||||
**그러나** {{cloze **전치사**}} **의 목적어는 오직 동명사만 가능하다!(이것이 부정사의 명사적 용법과의 사소한 차이점)**
|
||||
그러나 {{cloze **전치사**}} 의 목적어는 오직 동명사만 가능하다!(이것이 부정사의 명사적 용법과의 사소한 차이점)
|
||||
- ## **► 전치사의 목적어로 쓰이는 동명사**
|
||||
- The tool for ~~to analyze~~ the data is now available.
|
||||
- 전치사 뒤에는 명사가 와야하는데 준동사가 들어올 때 to부정사의 명사적 용법은 들어올 수 없고 오직 동명사만 들어와야 한다.
|
||||
|
||||
@ -5,5 +5,6 @@
|
||||
- [[Java]]
|
||||
- [[자료구조]]
|
||||
- [[알고리즘]]
|
||||
- [[코딩문제 복습용]]
|
||||
- [[코딩팁]]
|
||||
- [[코딩팁]]
|
||||
-
|
||||
- [[코딩문제 복습용]]
|
||||
Loading…
x
Reference in New Issue
Block a user