1, 2, 3 ์ธ ๊ฐ์ง ์ซ์๋ฅผ ์ฌ์ฉํด์ ๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ฐ์์ ๋ํด ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. n์ ์ต๋ ๊ฐ์ ๋ฐฑ๋ง์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ dfs๋ก ๊ตฌํ๋ค๋ ๊ฑด ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ฏธ ๊ตฌํด์ง ๊ฐ์ผ๋ก๋ถํฐ ๋์ ํด์ ๊ตฌํด๋๊ฐ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๋ค.
์ฐ์ 1์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ 1
๋ฑ ํ ๊ฐ์ง๋ค.
ํ์ง๋ง 2๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ 2
ํ ๊ฐ์ง์, 1์๋ค๊ฐ 1์ ๋ ํ๋ ๋ฐฉ๋ฒ ์ด 2๊ฐ์ง์ด๋ค.
3์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ง์ฐฌ๊ฐ์ง๋ก 3
ํ ๊ฐ์ง์, 2
์๋ค๊ฐ 1
์ ๋ํ๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์๋ 1, 2, 3 ์ธ ๊ฐ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์ผ๋ฏ๋ก ์ด๋ฒ์๋ 1
์๋ค๊ฐ 2
๋ฅผ ๋ํ๋ ๋ฐฉ๋ฒ๋ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก 1+1
์ 1
์ ๋ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
1+1
์ด ์ด๋์์ ๋์๋ ํ๋ฉด 2
๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์์ ๋์จ ๊ฒ์ด๋ค. ์ฆ 3์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ธ ๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์๋ค.
3
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ (3
๊ทธ ์์ฒด)1
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ (1
์๋ค๊ฐ 2๋ฅผ ๋ํ๋ฉด ๋๋ฏ๋ก)2
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ (2
์๋ค๊ฐ 1์ ๋ํ๋ฉด ๋๋ฏ๋ก)
๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ํ๋์ ํ๊ดํ์ผ๋ก ์น ํ ๋ถ๋ถ์ด 2
๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ๋ค์ด๋ค. 3์ ๊ฒฝ์ฐ 2์์ 1์ ๋ํ๋ฉด ๋๊ณ , 4๋ 2์๋ค๊ฐ 2๋ฅผ ๋ํ๋ค๋ ์ฐจ์ด๋ง ์์ ๋ฟ์ด๋ค.
์ด๊ฑด 3
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์๋ ์ ์ฉ๋ ์ ์๋ค. 4๋ 3์๋ค๊ฐ 1๋ง ๋ํ๋ฉด ๋๋ค. ๊ฒฐ๊ตญ 4๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด 3๊ฐ์ง๋ค
3
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ (3
์๋ค๊ฐ 1์ ๋ํ๋ฉด ๋๋ฏ๋ก)1
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ (1
์๋ค๊ฐ 3๋ฅผ ๋ํ๋ฉด ๋๋ฏ๋ก)2
์ ๊ตฌํ๋ ๋ฐฉ๋ฒ (2
์๋ค๊ฐ 2์ ๋ํ๋ฉด ๋๋ฏ๋ก)
ํ์ฌ ์๊ฐ n์ผ ๋ n-1, n-2, n-3์๋ฅผ 1,2,3 ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๋ชจ๋ ๋ํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
dp[i] = dp[i-1] + dp[i-2] + dp[i-3] (i >= 4)
n์ ์ต๋๊ฐ์ด ๋ฐฑ๋ง์ด๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ๊ฒฝ์ฐ 10์ต์ ๋์ด๊ฐ๊ฒ ๋๋ค. ํ ๋ฒ ๊ฐ์ ๊ตฌํ ๋๋ง๋ค ์ ์๋ ์๋ก ๋๋ ์ฃผ์ง ์์ผ๋ฉด ์ฌ์ฉํ๋ ์๋ฃํ์ ์ต๋๊ฐ์ ๋์ด์ ์๋ชป๋ ๊ฐ์ด ๊ตฌํด์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค.(์ค๋ฒํ๋ก์ฐ)
์๋ฐ์์๋ ์ค๋ฒํ๋ก์ฐ๋๋ฉด์ ์๋ชป๋ ๊ฐ์ด ๋์ถ๋์ด ํ๋ ธ์ต๋๋ค๊ฐ ๋จ์ง๋ง ํ์ด์ฌ์ ๊ฒฝ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ๋งค๋ฒ n์ ๋ํ ๊ฐ์ ๊ตฌํ๋ ค๊ณ ํ๋ฉด ์ด๋ฒ์๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ํ์ด ์์ฒด๊ฐ ๋์ ์ ํตํด ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก ๋ง์ฝ ์ฒซ ๋ฒ์งธ ๊ฐ์ด 100๋ง์ด์๋ค๋ฉด ๊ทธ ๋ค์ ๊ตฌํ๊ฒ ๋ ๊ฐ๋ค์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๊ตฌํ ๋ ์ด๋ฏธ ๋ค ๊ตฌํด์ง ๊ฐ๋ค์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฅ ์ฒ์๋ถํฐ ๋ฐฑ๋ง์ง๋ฆฌ ๋ฐฐ์ด์ ๋ง๋ค์ด๋๊ณ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ๊ตฌํ ํ ๊ฐ ํ ์ผ์์ ์ฃผ์ด์ง๋ n์ ๋ํด ํด๋นํ๋ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก ํ์ดํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public final static int DP_LENGTH = 1_000_001;
public final static int DIVIDE_NUMBER = 1_000_000_009;
public static long[] dp = new long[DP_LENGTH+3];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
memo();
while (T > 0) {
int n = Integer.parseInt(br.readLine());
System.out.println(dp[n] % DIVIDE_NUMBER);
T--;
}
}
public static void memo() {
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i < DP_LENGTH; i++) {
dp[i] = (dp[i-1] + dp[i-2] + dp[i-3]) % DIVIDE_NUMBER;
}
}
}