dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 회고
  • 반성
  • 부스트캠프
  • 프로그래머스 SQL
  • BFS
  • dp
  • HackerRank mysql
  • 프로그래머스
  • 일기
  • AI Tech
  • 백준
  • Hackerrank
  • Baekjoon
  • 네이버 부스트캠프
  • c++
  • 기록
  • 그래프탐색
  • 스프링
  • 백준 DP
  • 서블릿

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 2749] 피보나치 수 3 (DP, 피사노 주기) (C++)

2021. 2. 25. 17:09
728x90

www.acmicpc.net/problem/2749

 

2749번: 피보나치 수 3

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

www.acmicpc.net

평범한 피보나치 수를 구하는 문제인 것 같지만 주어지는 수의 범위가 10^18이다.

따라서 저만큼의 크기를 갖는 DP 배열을 생성하는 것은 불가능하기에 다른 방법을 이용해야 한다.

 

피보나치 수를 일정한 크기의 수로 나눈 나머지는 파사노 주기라고 하는 주기를 갖는다고 한다.

주기를 갖게 되면 N을 구하더라도 N%P(주기)와 같은 값을 갖게 된다.

www.acmicpc.net/blog/view/28

 

피보나치 수를 구하는 여러가지 방법

피보나치 수는 다음과 같이 정의되는 수열입니다. $F_0 = 0$ $F_1 = 1$ $F_n = F_{n-1} + F_{n-2}$ 피보나치 수를 조금 써보면, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 와 같습니다. 피보나치 수를 구하는 함수

www.acmicpc.net

백준 블로그에 백준 님이 올리신 글이다.

 

M이 10^K이고 K>2 이상의 수로 나눌 때 주기를 구하는 공식은 15*10^(K-1)이다.

따라서 엄청 큰 수가 들어와도 이 문제는 1,000,000으로 나눈 나머지를 구하는 문제이므로

총 0~15*10^5-1의 범위의 피보나치 수 내에서 정답이 구해질 것이다.

 

#include <iostream>
#include <cmath>

#define MOD 1000000 //10^6

using namespace std;

int P;
long long dp[1500000], n;

int main() {
	cin >> n;
	P = 15 * pow(10, 5); // 주기 구하는 공식 : 15 * 10^(n-1)
	int input = n % P;
	dp[1] = 1;
	dp[2] = 1;

	for (int i = 2; i <= input; i++) {
		dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;
	}

	cout << dp[input];
}

또한 피보나치를 구할 때 재귀 함수로 구하면 오류가 난다.

주어진 N을 주기로 나눈 나머지지만 몇십만의 값이 나오게 되면 함수 호출 스택의 크기를 넘어서게 된다.

따라서 FOR문을 통해서 구해주었다.

 

728x90
저작자표시 비영리 변경금지

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 2589] 보물섬 (BFS, 브루트포스) (C++)  (0) 2021.03.25
[baekjoon 20040] 사이클 게임 (유니온 파인드, union-find) (C++)  (0) 2021.03.21
[baekjoon 1541] 잃어버린 괄호 (그리디, 문자열, 수학) (C++)  (0) 2021.02.22
[baekjoon 20548] 칠리소스 (수학, 브루트포스) (C++)  (0) 2021.02.21
[baekjoon 2294] 동전 2- DP(동적 프로그래밍) (C++)  (0) 2021.02.18
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 2589] 보물섬 (BFS, 브루트포스) (C++)
    • [baekjoon 20040] 사이클 게임 (유니온 파인드, union-find) (C++)
    • [baekjoon 1541] 잃어버린 괄호 (그리디, 문자열, 수학) (C++)
    • [baekjoon 20548] 칠리소스 (수학, 브루트포스) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바