[ 백준 ] 1788 / 피보나치 수의 확장

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
187/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 1788 / 피보나치 수의 확장
 *
 * Kind :: Dynamic Programming + Math
 *
 * Insight
 * - F(n) = F(n-1) + F(n-2) 는
 *   F(n+2) = F(n+1) + F(n) 처럼 생각할 수 있고,
 *   위로부터 F(n) = F(n+2) - F(n+1) 임을 알 수 있다.
 *   + 주어지는 n 이 0 이상일 때는, F(n) = F(n-1) + F(n-2) 식을 활용하고
 *     n 이 0 미만일 때는 F(n) = F(n+2) - F(n+1) 식을 활용하자
 *
 * Point
 * - n 이 0 이상일 때 dp[i] = F(i)
 *   n 이 0 미만일 때 dp[i] = F(-i)
 *   로 생각해주자
 *   + 배열의 인덱스로 음수는 들어가지 못하니까...
 *     F(-2) 를 구하려고 할 때,
 *     편의상 dp[2] = F(-2) 로 생각하자는 뜻이다
 *     # 만약, F(-3) 을 구하고자 하면
 *       F(-3) = F(-1) - F(-2) 이므로
 *       dp[3] = dp[1] - dp[2] 로 구할 수 있다
 *       -> 이를 일반화하면, dp[i] = dp[i-2] - dp[i-1] 이다
 *
 * - 사실 그냥 몇개 만들어보면 규칙이 보인다
 *   F(1) = 1 | F(-1) = 1
 *   F(2) = 1 | F(-2) = -1
 *   F(3) = 2 | F(-3) = 2
 *   F(4) = 3 | F(-4) = -3
 *   F(5) = 5 | F(-5) = 5
 *   F(6) = 8 | F(-6) = -8
 *   ...
 *   # 역시 직접 해보는 것이 짱이야~
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>

using namespace std;

#define endl '\n'

// Set up : Global Variables
#define MOD 1000000000

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int n; cin >> n;

    // Process
    int dp[max(1,abs(n))+1]; /* dp 크기는 최소 2이상 <= dp[0], dp[1] */
    dp[0] = 0;
    dp[1] = 1; /* F(1) = F(-1) = 1 */
    if (n >= 0) { /* 주어진 n 이 0 이상일 때 */
        /* F(n) = F(n-1) + F(n-2), n >= 2 */
        for (int i=2; i<=n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
            dp[i] %= MOD;
        }
    } else { /* 주어진 n 이 0 미만일 때 */
        n = abs(n);
        /* F(n) = F(n+2) - F(n+1), n < 0 */
        for (int i=2; i<=n; i++) {
            dp[i] = dp[i-2] - dp[i-1];
            dp[i] %= MOD;
        }
    }

    // Control : Output
    cout << ((dp[n] > 0) ? 1 : (dp[n] < 0) ? -1 : 0) << endl;
    cout << abs(dp[n]) << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글