๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ
ํผ๋ณด๋์น ์๋ dp๋ฅผ ํ์ฉํ์ฌ fibo[i] = fibo[i-1] + fibo[i-2]์ ๊ฐ์ ๊ตฌํ ์ ์๋ค๋ ๊ฒ์ ์ตํ ์๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ ,, ๋ฌธ์ ์์ ์ฃผ์ด์ง๋ n ๊ฐ์ ๋ฒ์๊ฐ ๋๋ฌด ์ปค์ ๊ทธ๋ฅ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ฉด ๋ถ๋ช ํ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ธฐ์,, ์ด๋ป๊ฒ ๊ท์น์ ์ฐพ์์ผ ํ๋์ง์ ๋ํด ์ค์ ์ ์ผ๋ก ๊ณ ๋ฏผํ๋ค.
๐ ํ์ด
์ฐ์ ํผ๋ณด๋์น ์๋ฅผ ๋ด์ ๋ฐฐ์ด์๋ 1,000,000์ผ๋ก ๋๋ ๋๋จธ์ง์ ๊ฐ์ ๋ด์ ์์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒ์ ์ฌ์ ๋ค.
ํ์ง๋ง ํผ๋ณด๋์น ์์ ๊ท์น์ ์ฐพ๋ ๊ฒ์ ๊ฝค ์ด๋ ค์ ๋ค. ๊ท์น์ ์ฐพ๊ณ ์ถ์ด์ 50๋ฒ์งธ๊น์ง ์์ผ๋ก ๊ตฌํด๋ดค๋๋ฐ, ๋๋ฌด์ง ๊ท์น์ด ๋์ค์ง ์์ ๊ฒฐ๊ตญ ํผ๋ณด๋์น ์์ ๊ท์น์ ๋ํด ๊ฒ์ํด๋ดค๋ค.
'ํผ์ฌ๋ ธ ์ฃผ๊ธฐ(pisano period)' ๋ผ๊ณ ํผ๋ณด๋์น ์๋ฅผ ๋๋ ๋๋จธ์ง๋ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค๋ ๊ท์น์ด ์์๋ค.
์ฃผ๊ธฐ๋ฅผ P๋ผ๊ณ ํ๊ณ , ํผ๋ณด๋์น ์๋ฅผ ๋๋๋ ์๋ฅผ M์ด๋ผ๊ณ ํ ๋,
M = 10^k (k>2) ์ผ ๋, P = 15 * 10^(k-1) ์ด๋ค.
๋ฐ๋ผ์ ํผ๋ณด๋์น ์๋ฅผ 1,000, 000์ผ๋ก ๋๋๋ค๋ฉด 1,500,000๋ฒ์ ์ฃผ๊ธฐ๋ก ๋๊ฐ์ ๋๋จธ์ง ๊ฐ์ด ์ฃผ์ด์ง๋ค.
ํผ์ฌ๋ ธ ์ฃผ๊ธฐ๋ง ์๋ค๋ฉด, ๊ฐ๋จํ ๊ตฌํ ์ ์๋ ๋ฌธ์ ์๋ค.
(๋๋ถ๋ถ ํผ์ฌ๋
ธ ์ฃผ๊ธฐ์ ๋ํด ๋ชจ๋ฅผ ๊ฒ์ด๋ผ ์๊ฐํ๋ค .. ์ด ๋ฌธ์ ๊ฐ ๊ณจ๋2์ธ ์ด์ ์ธ๊ฐ ..)
๐ ์ฝ๋
import java.io.IOException;
import java.util.Scanner;
public class Main {
// 1,000,000(๋ฐฑ๋ง)์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅ
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int pisano = 1500000;
long[] fibo = new long[pisano+1];
long n = sc.nextLong() % pisano;
fibo[0] = 0;
fibo[1] = 1;
for(int i = 2; i <= pisano; i++) {
fibo[i] = (fibo[i-1] + fibo[i-2]) % 1000000;
}
System.out.println(fibo[(int)n]);
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2933๋ฒ : ๋ฏธ๋ค๋ | JAVA (0) | 2023.03.27 |
---|---|
[JAVA] ์ฐ์ ์์ ํ Priority Queue (0) | 2023.03.22 |
๋ฐฑ์ค 1722๋ฒ : ์์ด์ ์์ | JAVA (0) | 2023.03.20 |
๋ฐฑ์ค 10830๋ฒ : ํ๋ ฌ ์ ๊ณฑ | JAVA (0) | 2023.03.14 |
๋ฐฑ์ค 11401๋ฒ : ์ดํญ ๊ณ์ 3 | JAVA (0) | 2023.03.13 |
๋๊ธ