𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 15988번: 1, 2, 3 λ”ν•˜κΈ° 3 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 15988번: 1, 2, 3 λ”ν•˜κΈ° 3 - C++

.23 2022. 7. 8. 13:56
문제

μ •μˆ˜ 4λ₯Ό 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” 방법은 총 7가지가 μžˆλ‹€. 합을 λ‚˜νƒ€λ‚Ό λ•ŒλŠ” 수λ₯Ό 1개 이상 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있고, μ •μˆ˜ n이 주어진닀. n은 μ–‘μˆ˜μ΄λ©° 1,000,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

 

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€, n을 1, 2, 3의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ°©λ²•μ˜ 수λ₯Ό 1,000,000,009둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.


λ™μ κ³„νšλ²•μ„ μ‚¬μš©ν•˜μ—¬ ν‘ΈλŠ” 문제

πŸ”— 9095번: 1, 2, 3 λ”ν•˜κΈ° 와 λ™μΌν•œ λ¬Έμ œμ΄λ‹€.

λ‹€λ§Œ μ •μˆ˜ n의 λ²”μœ„κ°€ 1,000,000보닀 μž‘κ±°λ‚˜ 같은 수이기 λ•Œλ¬Έμ— μ•žμ„œ ν’€μ—ˆλ˜ top-down λ°©μ‹μœΌλ‘œ ν’€λ©΄ μ•ˆλ˜κ³  bottom-up λ°©μ‹μœΌλ‘œ ν’€μ–΄μ•Ό ν•œλ‹€.

 

μ˜€λ²„ν”Œλ‘œμš°κ°€ λ‚˜μ§€ μ•Šλ„λ‘ μœ μ˜ν•΄μ„œ μžλ£Œν˜• 섀정을 ν•΄μ€˜μ•Ό ν•œλ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 1000001
#define MOD 1000000009

long long int sum[MAX];
int DP(int num);

int main(void) {
    int T;
    scanf("%d", &T);

    for(int i = 0; i < T; i++) {
        int N;
        scanf("%d", &N);
        printf("%d\n", DP(N));
    }
    return 0;
}

int DP(int num) {
    sum[1] = 1;
    
    for(int i = 2; i <= num; i++) {
        sum[i] = (sum[i - 1] + sum[i - 2] + sum[i - 3]) % MOD;
        if(i == 2) {
            sum[i] += 1;
        }
        if(i == 3) {
            sum[i] += 1;
        }
    }

    return (sum[num] % MOD);
}
Comments