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

[λ°±μ€€] 1904: 01타일 - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 1904: 01타일 - C++

.23 2022. 7. 15. 16:54
문제

μ§€μ›μ΄μ—κ²Œ 2진 μˆ˜μ—΄μ„ κ°€λ₯΄μ³ μ£ΌκΈ° μœ„ν•΄, 지원이 μ•„λ²„μ§€λŠ” κ·Έμ—κ²Œ 타일듀을 μ„ λ¬Όν•΄μ£Όμ…¨λ‹€. 그리고 이 각각의 타일듀은 0 λ˜λŠ” 1이 μ“°μ—¬ μžˆλŠ” λ‚±μž₯의 타일듀이닀.

μ–΄λŠ λ‚  짓ꢂ은 동주가 μ§€μ›μ΄μ˜ 곡뢀λ₯Ό λ°©ν•΄ν•˜κΈ° μœ„ν•΄ 0이 쓰여진 λ‚±μž₯의 타일듀을 λΆ™μ—¬μ„œ ν•œ 쌍으둜 이루어진 00 타일듀을 λ§Œλ“€μ—ˆλ‹€. κ²°κ΅­ ν˜„μž¬ 1 ν•˜λ‚˜λ§ŒμœΌλ‘œ 이루어진 타일 λ˜λŠ” 0타일을 두 개 뢙인 ν•œ 쌍의 00νƒ€μΌλ“€λ§Œμ΄ λ‚¨κ²Œ λ˜μ—ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ μ§€μ›μ΄λŠ” νƒ€μΌλ‘œ 더 이상 크기가 N인 λͺ¨λ“  2진 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μ—†κ²Œ λ˜μ—ˆλ‹€. 예λ₯Ό λ“€μ–΄, N=1일 λ•Œ 1만 λ§Œλ“€ 수 있고, N=2일 λ•ŒλŠ” 00, 11을 λ§Œλ“€ 수 μžˆλ‹€. (01, 10은 λ§Œλ“€ 수 μ—†κ²Œ λ˜μ—ˆλ‹€.) λ˜ν•œ N=4일 λ•ŒλŠ” 0011, 0000, 1001, 1100, 1111 λ“± 총 5개의 2진 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

우리의 λͺ©ν‘œλŠ” N이 μ£Όμ–΄μ‘Œμ„ λ•Œ 지원이가 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  κ°€μ§“μˆ˜λ₯Ό μ„ΈλŠ” 것이닀. 단 타일듀은 λ¬΄ν•œνžˆ λ§Žμ€ κ²ƒμœΌλ‘œ κ°€μ •ν•˜μž.

 

μž…λ ₯

첫 번째 쀄에 μžμ—°μˆ˜ N이 주어진닀. (1 ≤ N ≤ 1,000,000)

 

좜λ ₯

첫 번째 쀄에 지원이가 λ§Œλ“€ 수 μžˆλŠ” 길이가 N인 λͺ¨λ“  2진 μˆ˜μ—΄μ˜ 개수λ₯Ό 15746으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.


λ™μ κ³„νšλ²•μ„ μ΄μš©ν•œ 문제이자...

κ²°κ΅­ κ·œμΉ™μ„ 찾으면 ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μΈ 문제

 

N = i μΌλ•Œ 00을 λΆ™μ—¬μ„œ μ‚¬μš©ν•˜λŠ” DP[i - 2]와 1을 λΆ™μ—¬ μ‚¬μš©ν•˜λŠ” DP[i - 1]을 λ”ν•œ 값이 DP[i]κ°€ λœλ‹€

λ”°λΌμ„œ 식을 μ •λ¦¬ν•˜λ©΄ μ΅μˆ™ν•œ 식이 λ‚˜μ˜¨λ‹€.

DP[i] = DP[i - 1] + DP[i - 2]

 

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

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

int main(void) {
    int N;
    scanf("%d", &N);
    printf("%d\n", DP(N));    
    return 0;
}

int DP(int num) {
    fib[1] = 1;
    fib[2] = 2;

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

    return fib[num];
}
Comments