logseq 20260110
This commit is contained in:
parent
e9bbdd6060
commit
9fd4bd6191
@ -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])
|
||||||
|
|
||||||
|
```
|
||||||
@ -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부정사의 명사적 용법은 들어올 수 없고 오직 동명사만 들어와야 한다.
|
||||||
|
|||||||
@ -5,5 +5,6 @@
|
|||||||
- [[Java]]
|
- [[Java]]
|
||||||
- [[자료구조]]
|
- [[자료구조]]
|
||||||
- [[알고리즘]]
|
- [[알고리즘]]
|
||||||
- [[코딩문제 복습용]]
|
- [[코딩팁]]
|
||||||
- [[코딩팁]]
|
-
|
||||||
|
- [[코딩문제 복습용]]
|
||||||
Loading…
x
Reference in New Issue
Block a user