logseq 20260110

This commit is contained in:
songyc macbook 2026-01-10 22:46:58 +09:00
parent e9bbdd6060
commit 9fd4bd6191
3 changed files with 106 additions and 5 deletions

View File

@ -90,4 +90,104 @@ deck:: Logseq/coding tip
# 홀수면: temp * temp * A # 홀수면: temp * temp * A
return multiply_matrix(multiply_matrix(temp, temp, N), adj, N) 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])
```

View File

@ -51,9 +51,9 @@ deck:: Logseq/영어 문법
- **타동사 이외에도 목적어를 가지는 품사 =** {{cloze **전치사**}} #card - **타동사 이외에도 목적어를 가지는 품사 =** {{cloze **전치사**}} #card
id:: 6867e92e-f3b8-4cd9-8a33-f3a7089f2230 id:: 6867e92e-f3b8-4cd9-8a33-f3a7089f2230
extra:: **전치사 역시 목적어를 가진다.**: extra:: **전치사 역시 목적어를 가진다.**:
- **타동사의 목적어는 동명사/부정사로 경우에 따라 다르지만 선별적으로 들어갈 수 있다. ** - 타동사의 목적어는 동명사/부정사로 경우에 따라 다르지만 선별적으로 들어갈 수 있다.
id:: 6867e964-d591-4404-9f90-05217908da45 id:: 6867e964-d591-4404-9f90-05217908da45
**그러나** {{cloze **전치사**}} **의 목적어는 오직 동명사만 가능하다!(이것이 부정사의 명사적 용법과의 사소한 차이점)** 그러나 {{cloze **전치사**}} 의 목적어는 오직 동명사만 가능하다!(이것이 부정사의 명사적 용법과의 사소한 차이점)
- ## **► 전치사의 목적어로 쓰이는 동명사** - ## **► 전치사의 목적어로 쓰이는 동명사**
- The tool for ~~to analyze~~ the data is now available. - The tool for ~~to analyze~~ the data is now available.
- 전치사 뒤에는 명사가 와야하는데 준동사가 들어올 때 to부정사의 명사적 용법은 들어올 수 없고 오직 동명사만 들어와야 한다. - 전치사 뒤에는 명사가 와야하는데 준동사가 들어올 때 to부정사의 명사적 용법은 들어올 수 없고 오직 동명사만 들어와야 한다.

View File

@ -5,5 +5,6 @@
- [[Java]] - [[Java]]
- [[자료구조]] - [[자료구조]]
- [[알고리즘]] - [[알고리즘]]
- [[코딩문제 복습용]] - [[코딩팁]]
- [[코딩팁]] -
- [[코딩문제 복습용]]