반응형
https://www.acmicpc.net/problem/2749
#include <bits/stdc++.h>
using namespace std;
const int mod =1'000'000;
struct Fibo{
long long arr[2][2] = {{1, 1}, {1,0}};
Fibo(){
arr[0][0] = 1;
arr[0][1] = 1;
arr[1][0] = 1;
arr[1][1] = 0;
};
Fibo mutiple(Fibo b){
long long tmp[2][2] = {{0, 0}, {0, 0}};
for(int i=0; i<2; i++){
for(int j=0; j<2; j++){
for(int k=0; k<2; k++){
tmp[i][k] += (arr[i][j] * b.arr[j][k])%mod;
tmp[i][k] %= mod;
}
}
}
Fibo ret = Fibo();
for(int i=0; i<2; i++){
for(int j=0; j<2; j++){
ret.arr[i][j] = tmp[i][j];
}
}
return ret;
}
void baseMultiple(){
long long res[2][2] = {{0,0}, {0, 0}};
long long tmp[2][2] = {{1, 1}, {1,0}};
for(int i=0; i<2; i++){
for(int j=0; j<2; j++){
for(int k=0; k<2; k++){
res[i][k] += (arr[i][j] * tmp[j][k])%mod;
res[i][k] %= mod;
}
}
}
for(int i=0; i<2; i++){
for(int j=0; j<2; j++){
arr[i][j] = res[i][j];
}
}
}
};
int cnt = 0;
long long N;
Fibo doubleSquare(Fibo cur, long long n){
if(n==1){
return cur;
}
Fibo tmp = doubleSquare(cur, n/2);
Fibo ret = tmp.mutiple(tmp);
if(n%2){
ret.baseMultiple();
}
return ret;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
Fibo st = Fibo();
Fibo fb = doubleSquare(st, N);
cout << fb.arr[1][0] << '\n';
return 0;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 16987번 : 계란으로 계란치기 - 백트래킹 C++ (0) | 2022.10.15 |
---|---|
백준 1941번 : 소문난 칠공주 - 백트래킹 C++ (0) | 2022.10.15 |
백준 1202번 보석 도둑 - 우선순위큐 활용 C++ (0) | 2022.10.13 |
백준 10830번 : 행렬 제곱 - 재귀 (0) | 2022.10.11 |
백준 1300번 : K번째 수 - 이분 탐색 C++ (0) | 2022.10.05 |