๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[๋ฐฑ์ค€] 1788๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ํ™•์žฅ - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1788๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ํ™•์žฅ - C++

.23 2022. 2. 21. 17:17
๋ฌธ์ œ

์ˆ˜ํ•™์—์„œ, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” ์œ„์˜ ์ ํ™”์‹๊ณผ ๊ฐ™์ด ๊ท€๋‚ฉ์ ์œผ๋กœ ์ •์˜๋˜๋Š” ์ˆ˜์—ด์ด๋‹ค. ์œ„์˜ ์‹์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ F(n)์€ 0 ์ด์ƒ์˜ n์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜๋œ๋‹ค.

ํ•˜์ง€๋งŒ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ F(n)์„ n์ด ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ๋กœ๋„ ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์‹์—์„œ n > 1์ธ ๊ฒฝ์šฐ์—๋งŒ ์„ฑ๋ฆฝํ•˜๋Š” F(n) = F(n-1) + F(n-2)๋ฅผ n ≤ 1์ผ ๋•Œ๋„ ์„ฑ๋ฆฝ๋˜๋„๋ก ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด n = 1์ผ ๋•Œ F(1) = F(0) + F(-1)์ด ์„ฑ๋ฆฝ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, F(-1)์€ 1์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ F(n)์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. n์€ ์Œ์ˆ˜๋กœ ์ฃผ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— n์ด ์ฃผ์–ด์ง„๋‹ค. n์€ ์ ˆ๋Œ“๊ฐ’์ด 1,000,000์„ ๋„˜์ง€ ์•Š๋Š” ์ •์ˆ˜์ด๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— F(n)์ด ์–‘์ˆ˜์ด๋ฉด 1, 0์ด๋ฉด 0, ์Œ์ˆ˜์ด๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” F(n)์˜ ์ ˆ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ์ˆ˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ ˆ๋Œ“๊ฐ’์„ 1,000,000,000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


๋™์ ๊ณ„ํš๋ฒ•์œผ๋กœ ํ’€์—ˆ๋˜ ๋ฌธ์ œ.

 

์Œ์ˆ˜๋ผ ๋‹นํ™ฉํ–ˆ๋Š”๋ฐ, F(0)๋ถ€ํ„ฐ F(-5), F(-6)๊นŒ์ง€ ๋‚˜์—ดํ•˜๋‹ค๋ณด๋‹ˆ ๊ทœ์น™์ด ๋ณด์˜€๋‹ค.

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

F(-5) = F(-3) - F(-4) = 5

...

๋ณด๋‹ค๋ณด๋ฉด N์˜ ์ ˆ๋Œ“๊ฐ’์ด ์ง์ˆ˜์ผ ๋•Œ๋งŒ ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ณ , ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด๊ณผ ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ N์ด ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์€ ์ผ€์ด์Šค๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์–‘์ˆ˜๋กœ ๋ฐ”๊ฟ”์ค€ ๋’ค ๋™์ผํ•˜๊ฒŒ ํ’€์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ
#include <cstdio>
#define MOD 1000000000
#define MAX 1000001

long long DP(int num);

int main(void) {
    int n, flag = 1;
    scanf("%d", &n);

    if(n < 0) {
        n *= -1;
        if(n % 2 == 0) flag = -1;
    }
    
    if(n == 0) flag = 0;

    printf("%d\n%lld\n", flag, DP(n));
    return 0;
}

long long DP(int num) {
    long long arr[MAX];

    arr[0] = 0;
    arr[1] = 1;

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

    return arr[num] % MOD;
}
Comments