문제링크 : https://www.acmicpc.net/problem/1788
1788번: 피보나치 수의 확장
첫째 줄에 F(n)이 양수이면 1, 0이면 0, 음수이면 -1을 출력한다. 둘째 줄에는 F(n)의 절댓값을 출력한다. 이 수가 충분히 커질 수 있으므로, 절댓값을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
const int MOD = 1000000000;
int dp[1000001];
int sign=1;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
if(N<0)
{
N*=-1;
if(N%2==0) sign=-1; //N이 짝수일때만 음수
}
if(N==0) sign=0;
dp[0]=0; dp[1]=1;
for(int i=2; i<=N; i++)
{
dp[i] = (dp[i-1]+dp[i-2])%MOD;
}
cout << sign << "\n" <<dp[N];
return 0;
}
흔히 알고 있는 피보차니 수열에 음수까지 확장된 문제이다.
우선 음수일 때 케이스를 보면 다음과 같다.
F[i] = F[i-1] + F[i-2];
-> F[i-2] = F[i] - F[i-1];
F[-1] = F[1] - F[0] -> 1
F[-2] = F[0] - F[-1] -> -1
F[-3] = F[-1] - F[-2] -> 2
F[-4] = F[-2] - F[-3] -> -3
보면 N의 절대값이 짝수일 때 음수가 나오는 것을 볼 수 있다.
따라서 부호를 출력하기 위한 변수 sign을 abs(N)이 짝수일 경우에 -1로 저장해준다.
그리고 문제에서 N==0 일때는 0을 출력하도록 명시했다.
이 경우에 sign을 0으로 저장하고 2가지 케이스 이외에는 1이므로 처음에 1로 선언하고 시작했다.
이외에는 흔히아는 피보나치 수열 점화식을 그대로 작성하면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 11057번] 오르막 수 (C++) (0) | 2023.10.13 |
---|---|
[백준 15235번] Olympiad Pizza (C++) (0) | 2023.10.08 |
[백준 15988번] 1, 2, 3 더하기 3 (C++) (0) | 2023.10.06 |
[백준 15624번] 피보나치 수 7 (C++) (0) | 2023.10.05 |
[백준 16493번] 최대 페이지 수 (C++) (0) | 2023.10.02 |