dh-winternagi 님의 블로그
(11444) 피보나치 수 6 본문
https://www.acmicpc.net/problem/11444
단계별로 풀어보기
24단계(분할 정복) 8번째
피보나치 수의 점화식을 행렬로 표현하고 정리하면 일반항을 행렬의 거듭제곱으로 나타낼 수 있는 유명한 공식이 있다.
알고리즘 지식이 아니라 수학 지식에 가까우므로 유도나 설명은 생략한다(검색하면 잘 나온다).
아무튼 그 공식대로 행렬의 거듭제곱을 해서 풀면 된다.

#include <iostream>
#include <vector>
using namespace std;
#define p 1000000007
typedef vector<vector<long>> matrix;
matrix operator*(const matrix &a, const matrix &b){
matrix res(a.size(), vector<long> (b[0].size()));
for(int i=0;i<res.size();i++){
for(int j=0;j<res[0].size();j++){
for(int k=0;k<a[0].size();k++){
res[i][j]+= a[i][k]*b[k][j];
}
res[i][j]%= p;
}
}
return res;
}
matrix power(matrix &base, long expo){
matrix res(base.size(), vector<long> (base.size()));
for(int i=0;i<base.size();i++) res[i][i]= 1;
while(expo){
if(expo&1) res= res*base;
expo/= 2;
base= base*base;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long n;
cin >> n;
vector<vector<long>> a= {{1, 1}, {1, 0}};
a= power(a, n);
cout << a[0][1];
return 0;
}'백준 (C++) > Solve' 카테고리의 다른 글
| (1920) 수 찾기 (0) | 2026.04.18 |
|---|---|
| (6549) 히스토그램에서 가장 큰 직사각형 (0) | 2026.04.18 |
| (10830) 행렬 제곱 (0) | 2026.04.18 |
| (2740) 행렬 곱셈 (0) | 2026.04.18 |
| (11401) 이항 계수 3 (0) | 2026.04.18 |
