https://www.acmicpc.net/problem/15624
15624번: 피보나치 수 7
첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다.
www.acmicpc.net
풀이
피보나치 수 문제인데 범위가 커져서 1,000,000,007로 나누는 문제이다.
나머지 분배법칙에 대해 자세히 알고있지 못하여 살짝 해맸는데 나머지 분배법칙만 잘 알고 있으면 dp를 사용하여 쉽게 풀수 있는 문제이다.
나머지 분배법칙의 증명은 다음 블로그를 참고하였다.
https://sexycoder.tistory.com/66
모듈러 연산의 성질과 증명
모듈러 연산의 성질과 증명 위와 같이 모듈러 연산은 나머지를 구하는 연산자이며 다음의 분배법칙이 모두 성립한다. 왜 이런지 궁금해서 계속 찾아보다가 간신히 찾은게 칸 아카데미에서 증명
sexycoder.tistory.com
이 문제를 푸는것과는 관계가 없지만 공부를겸해서 나눗셈에 대한 나머지 분배 법칙 증명은 다음 블로그를 통해 알 수 있었다.
https://goodteacher.tistory.com/398
[알고리즘]나머지의 순환과 페르마 소정리
페르마는.. 무려 변호사에 취미 삼아 수학을 했다고 한다. ㅎㄷㄷ 피에르 드 페르마 - 위키백과, 우리 모두의 백과사전 (wikipedia.org) 피에르 드 페르마 - 위키백과, 우리 모두의 백과사전 피에르 드
goodteacher.tistory.com
위에서 B^(p-2)는 잉여역수인데 이에대한 내용은 여기에 있다.
페르마의 소정리 ( 잉여역수 구하기 )
Table of Contents 개요 ( 프로그래밍에서의 페르마의 소정리 ) 페르마의 소정리로 잉여역수 구하기 구현 나눗셈 연산에 적용 문제 1. 개요 ( 프로그래밍에서의 페르마의 소정리 ) modular 연산의 합동
www.weeklyps.com
코드
#include<iostream>
using namespace std;
long long dp[1000000];
int main() {
int n;
cin >> n;
dp[0] = 0;
dp[1] = 1;
dp[2] =1;
for (int i = 3; i <= n; i++) {
dp[i] =( (dp[i-1] % 1000000007) +(dp[i-2] % 1000000007)) % 1000000007;
}
cout << dp[n];
}
'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/C++] 알고리즘 5582번 공통 부분 문자열 (0) | 2022.01.23 |
---|---|
[BOJ/c++] 2110 - 공유기 설치 (0) | 2022.01.22 |
[BOJ / python] 14430번: 자원 캐기 (0) | 2022.01.22 |
[BOJ / Swift & Python] 17626 - Four Squares (2) | 2022.01.21 |
[백준/JAVA] - 2110번 공유기 설치 (0) | 2022.01.21 |