##꽤 어려워 했던 부분 노트 사진 :
##핵심 개념(작성중):
##코드 :
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
typedef unsigned long ULONG;
typedef struct _tagMatrix2x2
{
ULONG Data[2][2];
}Matrix2x2;
Matrix2x2 Matrix2x2_M(Matrix2x2 A, Matrix2x2 B)
{
//1_ 반환용 임시 행렬 C선언;
Matrix2x2 C;
//2_ 곱셈 연산
C.Data[0][0] = A.Data[0][0] * B.Data[0][0] + A.Data[0][1] * B.Data[1][0];
C.Data[0][1] = A.Data[0][0] * B.Data[0][1] + A.Data[0][1] * B.Data[1][1];
C.Data[1][0] = A.Data[1][0] * B.Data[0][0] + A.Data[1][1] * B.Data[1][0];
C.Data[1][1] = A.Data[1][0] * B.Data[0][1] + A.Data[1][1] * B.Data[1][1];
//3_ C반환
return C;
}
Matrix2x2 Matrix2x2_P(Matrix2x2 A, int N)
{
//종료 조건 : A^1
if (N == 1)
{
return A;
}
//분할
A = Matrix2x2_P(A, N / 2);
//정복 (구현부) (쪼개진 후, 역순으로 조립 생각)
//A^2 = A^1 X A^1 부터 생각
A = Matrix2x2_M(A, A);
if (N % 2 != 0) {//N이 홀수 라면, A^1을 한번 더 곱해야 함
Matrix2x2 B;
B.Data[0][0] = 1;
B.Data[0][1] = 1;
B.Data[1][0] = 1;
B.Data[1][1] = 0;
A = Matrix2x2_M(A, B);
}
return A;
}
//행렬 제곱 후, 01원소 || 10원소만 뽑아내기
ULONG Fibo(int N)
{
//행렬 A 선언 , 초기화
Matrix2x2 A;
A.Data[0][0] = 1;
A.Data[0][1] = 1;
A.Data[1][0] = 1;
A.Data[1][1] = 0;
//행렬 A 제곱 연산
A = Matrix2x2_P(A, N);
//원소 추출, 반환
return A.Data[0][1];
}
int main() {
int N;
scanf("%d", &N);
printf("F(%d) = %lu\n", N, Fibo(N));
return 0;
}
|
cs |
'알고리즘(C언어) > 이것이 자료구조+알고리즘이다(박상현)_알고리즘' 카테고리의 다른 글
(6)[Chapter12]분할정복_2_거듭제곱 (0) | 2024.09.06 |
---|---|
(5)[Chapter12]분할정복_1_병합정렬(이론_노트) (0) | 2024.09.06 |
(4)[Chapter11]알고리즘_성능분석_4_재귀함수_시간복잡도구하기(마스터정리) (0) | 2024.09.01 |
(3)[Chapter11]알고리즘_성능분석_3_측정시간과 점근표기법 (0) | 2024.09.01 |
(2)[Chapter11]알고리즘_성능분석_2_퀵정렬_복습 (0) | 2024.08.31 |