๐Ÿงท ๋ฌธ์ œ

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

์ •์ˆ˜ n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, n์„ 1, 2, 3์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณผ์ •์—์„œ ๊ฐ™์€ ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์—ฐ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ›  ํ’€์ด

์ด ๋ฌธ์ œ๋Š” DP table์„ 1์ฐจ์›์ด ์•„๋‹Œ 2์ฐจ์›์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 1.
 ๋จผ์ € ๊ฐ ์ธ๋ฑ์Šค์˜ DP table์„ ๊ธธ์ด 4์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ›๋Š”๋ฐ 0๋ฒˆ ์ธ๋ฑ์Šค์—๋Š” n์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜, 1 ~ 3๋ฒˆ ์ธ๋ฑ์Šค์—๋Š” ๊ฐ ์ธ๋ฑ์Šค๋กœ ๋๋‚˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
 ์˜ˆ๋ฅผ ๋“ค๋ฉด d[3]์˜ ๊ฒฝ์šฐ 2 + 1, 1 + 2, 3 ์ด๋ ‡๊ฒŒ ์ด 3๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  1, 2, 3์œผ๋กœ ๋๋‚˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ 1๊ฐœ์”ฉ ์กด์žฌํ•˜๋ฏ€๋กœ d[3] = [3, 1, 1, 1]๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ d[1] = [1, 1, 0, 0], d[2] = [1, 0, 1, 0]์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 2.
 d[i], (4 โ‰ค i)๋ถ€ํ„ฐ๋Š” d[i-1]์˜ ๋ฐฉ๋ฒ•์˜ ์ˆ˜์—์„œ ๋์ด 1๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, d[i-2]์—์„œ ๋์ด 2๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, d[i-3]์—์„œ ๋์ด 3์œผ๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋”ํ•˜๋ฉด ๋œ๋‹ค.
 ์ด๊ฑธ ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด d[i][1] = d[i-1][0] - d[i-1][1], d[i][2] = d[i-2][0] - d[i-2][2], d[i][3] = d[i-3][0] - d[i-3][3]์ด๋‹ค.
 ๋ฐ˜๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ for๋ฌธ์„ ์ด์šฉํ•˜๋ฉด for j in range(1, 4): d[i][j] = d[i-j][0] - d[i-j][j]๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Step 3.
 ์œ„์—์„œ d[n]์˜ 0๋ฒˆ ์ธ๋ฑ์Šค์—๋Š” n์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ, d[n][1] + d[n][2] + d[n][3]์˜ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์ตœ์ข…์ ์œผ๋กœ d[n][0]์„ ์ถœ๋ ฅํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ–Š ๋‚˜์˜ ์ฝ”๋“œ

import sys

input = sys.stdin.readline

if __name__ == "__main__":
    t = int(input())
    d = [[0] * 4 for _ in range(100001)]
    d[1] = [1, 1, 0, 0]
    d[2] = [1, 0, 1, 0]
    d[3] = [3, 1, 1, 1]

    for i in range(4, 100001):
        cnt = 0
        for j in range(1, 4):
            d[i][j] = d[i-j][0] - d[i-j][j]
            cnt += d[i][j]
        d[i][0] = cnt % 1000000009

    for _ in range(t):
        n = int(input())
        print(d[n][0])