상세 컨텐츠

본문 제목

2749. 피보나치 수 3

알고리즘/백준

by 아리따운노을 2020. 1. 19. 19:31

본문

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초128 MB128783873317337.115%

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력한다.

예제 입력 1 

1000

예제 출력 1 

228875


눈 피보나치 수열인데 input의 크기가 매우 크다. 어떻게 해야할지 잘 몰라서 구글링을 뒤져보니

피보나치 수열에는 피사노 주기라는게 있다고 한다. 

정의는 


주기의 길이가 P면, N번째 피보나치 수를 M으로 나눈 나머지는

 N%P번째 피보나치 수를 M으로 나눈 나머지와 같다.


.그래서 1000000만으로 나눈 피보나치의 나머지는 1500000의 주기를 가진다고 한다. 어째 1000단위까지 규칙을 살펴보려고 했는데 전혀 겹치는게 없었다. 1500000은 누가 찾았는지도 참 신기하다.

골드 2라고 꽤 어려운 문제라고는 나와있지만 피사노 주기를 검색해보기만 하면 아주 간단하게 풀 수 있다.


코드


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
#include <iostream>
using namespace std;
 
int dp[1500001];
 
void solve()
{
    dp[0]=0;
    dp[1]=1;
    for(int i=2;i<1500001;i++)
    {
        dp[i]=(dp[i-1]+dp[i-2])%1000000;
    }
}
int main()
{
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);
    long long tc;
    cin>>tc;
    solve();
    cout<<dp[tc%1500000]<<'\n';
    return 0;
}
 
cs




'알고리즘 > 백준' 카테고리의 다른 글

10610. 30  (0) 2020.02.01
7576. 토마토  (0) 2020.01.20
9020. 골드바흐의 추측  (0) 2020.01.19
1149. RGB거리 성공  (0) 2020.01.15
1261. 알고스팟  (0) 2020.01.13

관련글 더보기

댓글 영역