본문 바로가기
Algorithm/BOJ

[BOJ]15988번: 1, 2, 3 더하기 3(c++)

by HBGB 2020. 4. 22.

https://www.acmicpc.net/problem/15988

 

15988번: 1, 2, 3 더하기 3

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
const int MAX = 1000000;
const long mod = 1000000009LL;
long long D[MAX + 1];
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    /*
    점화식
        D[n] : n을 1, 2, 3의 합으로 만드는 방법의 수
        D[n] = D[n - 1] (+ 1)
             + D[n - 2] (+ 2)
             + D{n - 3] (+ 3)
    */
    D[1= 1;
    D[2= 2;
    D[3= 4;
    for (int i = 4; i <= MAX; i++)
    {
        D[i] = (D[i - 1+ D[i - 2+ D[i - 3]) % mod;
    }
 
    int T;
    cin >> T;
    while (T--)
    {
        int n;
        cin >> n;
        cout << D[n] << '\n';
    }
 
    return 0;
}
Colored by Color Scripter

 

생각보다 어렵지 않았던 문제!

점화식을 세우기만 하면 해결이다. 

 

TIP

n은 양수이며 1,000,000보다 작거나 같다.

 

수의 범위가 약 100만 이하이면

테스트 케이스가 주어지기 전에, 모든 수열을 구해놓는 것이 효율적이다. 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]1309번: 동물원(c++)  (0) 2020.04.22
[BOJ]1149번: RGB거리(c++)  (0) 2020.04.22
[BOJ]17299번: 오등큰수(c++)  (0) 2020.04.21
[BOJ]17298번: 오큰수(c++)  (0) 2020.04.21
[BOJ]10799번: 쇠막대기(c++)  (0) 2020.04.21

댓글