๐ฃ ์ ๋ช ํ๊ณ ์ ๋ช ํ ํผ๋ณด๋์น ์์ด(Fibonacci Sequence)์ ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765 ...
โ Recursive Definition
๐ฃ ์ฆ, Fn์ n๋ฒ์งธ ํผ๋ณด๋์น ์๋ผ๊ณ ํ๋ค๋ฉด ์ฌ๊ท ๋ฐฉ์์ผ๋ก Fn์ ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
F(n) = F(n-1) + F(n-2)
with initial conditions F(0) = 0 and F(1) = 1
: ์ฆ, Fn์ ๊ตฌํ ๋ Fn-1๊ณผ Fn-2๋ฅผ ์ฌ์ฉํด ์ฌ๊ท์ ํธ์ถ๋ก Fn์ ์ ์ํ ์ ์๋ค. Fn์ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ O(2^n). Fn ํธ์ถ์ ๋์ผ ์ฌ๊ทํจ์ ๋ ๋ฒ์ ํธ์ถํ๊ธฐ ๋๋ฌธ.
n=int(input())
def get_fibonacci(n):
if n==1:
return 1
elif n==0:
return 0
else:
return get_fibonacci(n-2)+get_fibonacci(n-1)
if n>=2:
print(get_fibonacci(n))
else:
if n==0: print(0)
else: print(1) #n==1
โก Memoization DP technique
๐ฃ ์ โ ์ฌ๊ท ํธ์ถ์ ๊ฒฐ์ ์ ์ธ ๋จ์ ์ ๋ฐ๋ก ์ค๋ณต ํธ์ถ๋๋ Fx(0<=x<N)์ด ๋๋ฌด ๋ง๋ค๋ ์ . ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ฐ์ก์ ๋ ๋นํจ์จ์ ์ด๋ค. ์๋ฅผ ๋ค์ด F8์ ๊ตฌํ๊ณ ์ ํ ๋, F7 ๋ฐ๋ก, F6๋ฐ๋ก ํธ์ถ๋๋ค. ๊ทธ๋ฆฌ๊ณ F7์์ ๋ F6๊ณผ F5๊ฐ ํธ์ถ๋๋๋ฐ, ์ด ๋ F6์ด ๋๋ฒ์ด๋ ํธ์ถ๋จ์ ์ ์ ์๋ค.
๐ฃ ์ค๋ณตํธ์ถ๋๋ Fx์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด Fx(0<=x<N)๊ฐ ๊ฐ๊ฐ ์ต๋ 2๋ฒ๋ง ํธ์ถ๋ ์ ์๊ฒ ์๊ฐ ๋ณต์ก๋ O(N)์ผ๋ก ํ ์ ์๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ํ ํฌ๋์ ํ์ฉํด, ์๋์ ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ํ์ฉํด๋๊ฐ๋ฉด ๋๋ค.
: ์์ ๋ ์ซ์๋ฅผ ํ์ฉํด์ ์๋ก์ด ์ซ์๋ฅผ ๊ตฌํด๋๊ฐ๋ ๋ฐฉ์์ผ๋ก(memoization DP) ์งํํ๋ค. ๊ทธ๋ฌ๋ฉด ๋งจ ์ ์ซ์ 0๊ณผ ๋ ์์ ๋ฐ ๋ ์์ ์์ ์ซ์๋ฅผ ์ ์ธํ๊ณ , ๊ทธ ์ฌ์ด์ ๋ชจ๋ ์ซ์๋ ๊ฐ๊ฐ ๋ ๋ฒ๋ง ํธ์ถ. ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ ๋๋ต์ ์ผ๋ก O(2N)์ด๋ผ ํ ์ ์์ผ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ O(N)
โข Pisano Period
๐ฃ ํผ๋ณด๋์น ์๋ฅผ m์ผ๋ก ๋๋ ๋๋จธ์ง๋ ์ฃผ๊ธฐ๋ฅผ ์ด๋ฃฌ๋ค๋ ์ฌ์ค์ ํ์ฉ. k(m)์ ๋ฐ๋ณตํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ผ๊ณ ํ๋ฉด k(m)๊ณผ ๊ด๋ จํ ์ฌ๋ฌ ์ฑ์ง์ด ์กด์ฌํ๋ค.
๐ฃ ์ผ๋จ ํผ์ฌ๋ ธ ์ฃผ๊ธฐ๋ ๋ชจ๋ m์ ๋ํด ์กด์ฌํ๋ค. ์ฆ, m์ผ๋ก ๋๋ ๋๋จธ์ง์ ์์ด์ ์ฃผ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
→ Fn%m์ ๊ตฌํ ๋ค, (F(n-1)%m, F(n)%m)์ ๋น๋๊ธฐ์ง์ ์๋ฆฌ์ ์ํด m^2 ๊ฒฝ์ฐ์ ์์ ๋ฌด์กฐ๊ฑด ํฌํจ. ๋ฐ๋ผ์, ๋น๋๊ธฐ์ง์ ์๋ฆฌ์ ์ํด (F(n-1)%m, F(n)%m)์ ์ต๋ m^2๊ฐ๊ฐ ์กด์ฌํ๋ฉฐ, ์ด๋ ๊ณง (m^2+1)๋ฒ์งธ์ pair (F(n-1)%m, F(n)%m))๋ ์์ pair ์ค ์ ์ด๋ 1๊ฐ ์ด์์ pair์ ์ค๋ณต๋จ์ ์ ์ ์๋ค. ์ด๋ฅผ ํตํด ํผ์ฌ๋ ธ ์ฃผ๊ธฐ๋ ๋ฌด์กฐ๊ฑด ์กด์ฌํจ์ ์ ์ ์๊ณ , k(m)์ ์ต๋ m^2+1์ดํ์์ ์ ์ ์๋ค.
ex) mod 10์์ ์์ ์์ ์ง์ ์ด๋ฃจ์ด (0,0) ~ (0,9) / (1,0) ~ (1,9) ~ ์ ๊ฐ์ด ์ด 10^2์ 100๊ฐ์ง ๊ฒฝ์ฐ์ ์ ์กด์ฌ. ๋ฐ๋ผ์ ํผ์ฌ๋ ธ ์ฃผ๊ธฐ k(10)์ ์ต๋๊ฐ์ 101์ด๋ค. F1๊ณผ F2๋ 1, 1์ด๋ฏ๋ก 1, 1์ด ๋์ฌ ๋ ๋ฉ์ถฐ์ ํผ์ฌ๋ ธ ์ฃผ๊ธฐ๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
ex) mod 11 ์์(k(11) = 8) : ๊ทธ๋ฆผ ์ถ์ฒ: BOJ 9471
: ํผ๋ณด๋์น ์์ด์ ๋ชจ๋ ์์๋ฅผ mod m์ผ๋ก ์งํํ ๊ฒฐ๊ณผ์์, ํผ์ฌ๋ ธ ์ฃผ๊ธฐ์ ๊ธธ์ด๋ฅผ k(m)๋ผ๊ณ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ํผ์ฌ๋ ธ ์ฃผ๊ธฐ ๊ด๋ จ 7๊ฐ์ ์ฑ์ง์ด ์๋ ค์ ธ ์๋ค.
(1) m>2์ธ ๊ฒฝ์ฐ k(m)์ ์ง์
(2) ์์์ ์ง์ ์ ์ n>2์ ๋ํด์ k(m) = n์ธ m์ด ํญ์ ์กด์ฌ
(3) k(m)<=m^2-1
(4) k(2^n)=3x2^(n-1)
(5) k(5^n)=4x5^n
(6) k(2x5^n)=6n
(7) n>=2๋ผ๋ฉด k(10^n) = 15x(10^(n-1))
โฃ Power by Divide & Conquer (Matrix) technique
๐ฃ ์ โ ๊ณผ โก์์ ์ค๋ช ํ ๋ฐฉ๋ฒ๊ณผ ๋ฌ๋ฆฌ, '๊ฑฐ๋ญ์ ๊ณฑ์ ํ์ฉํ ๋ถํ ์ ๋ณต'์ผ๋ก ๋ ๋น ๋ฅธ ์๊ฐ๋ณต์ก๋๋ก ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ ์ ์๋ค.
F(n+2) = F(n+1) + F(n)
F(n+1) = F(n) + F(n-1)
: ์ ๋ ์์ ํ๋ ฌ์ ํ์ฉํด์ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.(n>=2)
: ์ ์์ Fn(n>=1)์ ๊ดํด ์ฐ์์ ์ผ๋ก (1 1 1 0) 2x2 ํ๋ ฌ์ ๊ณฑํ๋ฉด ์๋์ ๊ฐ๋ค.
: ์ฆ, Fn์ ๊ตฌํ๊ธฐ ์ํด์๋ (1 1 1 0) 2x2 ํ๋ ฌ์ n-1๋ฒ ์ ๊ณฑํ๋ฉด ๋๋ค. ์ด ๋ Power by Divide & Conquer ํ ํฌ๋์ ํ์ฉํด O(log(n-1)), ์ฆ O(logn)์ผ๋ก Fn์ ๊ตฌํ ์ ์๋ค. (1 1 1 0) 2x2 ํ๋ ฌ์ n-1๋ฒ ์ ๊ณฑํ ๋ค ์ผ์ชฝ ์๋จ ์์([0][0])๊ฐ Fn.
n=int(input())
BIG = 1_000_000_007
def get_power(a,b,c):
if b <= 1:
return [[a[0][0]%BIG,a[0][1]%BIG],[a[1][0]%BIG,a[1][1]%BIG]]
x = get_power(a,b//2,c)
if b % 2 == 0:
return prod(x,x)
else:
return prod(prod(x,x),a)
def prod(A,B):
a,b,c,d=A[0][0],A[0][1],A[1][0],A[1][1]
e,f,g,h=B[0][0],B[0][1],B[1][0],B[1][1]
return [[(a*e+b*g)%BIG,(a*f+b*h)%BIG],[(c*e+d*g)%BIG,(c*f+d*h)%BIG]]
core = [[1,1],[1,0]]
matrix = get_power(core,n-1,BIG)
print(matrix[0][0]%BIG)
๐ฃ ๋ ํ๋ ฌ A์ B์ ๊ณฑ(2x2 ํ๋ ฌ)์ ๊ฒฐ๊ณผ ํ๋ ฌ์ ์ถ๋ ฅํ๋ prod() ํจ์ ์์ฑ
๐ฃ Fn์ core ํ๋ ฌ์ n-1 ์ ๊ณฑํ 2x2 ํ๋ ฌ์ ์ผ์ชฝ ์๋จ ์์([0][0])์์ ์๊ณ , n-1 ์ ๊ณฑ์ divide & conquer๊ธฐ๋ฒ์ผ๋ก ์งํ
โ a์ b์น์์ b๊ฐ 1์ดํ์ผ ๋ a ์์ฒด๋ฅผ ์ถ๋ ฅ
โก a์ b์น์์ b๊ฐ 1๋ณด๋ค ํด ๋ b๊ฐ ์ง์์ผ ๊ฒฝ์ฐ b//2ํ get_power() ๊ฒฐ๊ณผ๋ฅผ x๋ผ๊ณ ํ๋ฉด prod(x,x) / b๊ฐ ํ์์ผ ๊ฒฝ์ฐ prod(prod(x,x),a)
→ ๋จ์ ๊ณฑ์ด ์๋ ํ๋ ฌ ๊ณฑ์ด๋ฏ๋ก prod()ํจ์ ์ฌ์ฉ๋ง ์ฃผ์
๐ฃ ๋ค๋ง, ํผ๋ณด๋์น ์๊ฐ ๋งค์ฐ ์ปค์ง ์ ์์ผ๋ฏ๋ก ํฐ ์๋ฅผ ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก ์ถ์ . modulo operation ์ฑ์ง ํ์ฉํด์ ๋์ค๋์ค ๊ตฌํ ๋๋จธ์ง๋ฅผ ๊ณฑ/๋ํ๊ธฐ ์์ ๋กญ๊ฒ ํด์ฃผ๋ฉด ๋จ.
โค Sigma Fibonaccis
๐ฃ ํผ๋ณด๋์น ๊ด๋ จ ์ฌ๋ฌ sigma ํฉ ํํ๋ ๋ค์ํ ์ฑ์ง์ ๊ฐ์ง๋ค.
(1) F1~Fn๊น์ง์ n๊ฐ์ ํผ๋ณด๋์น ์์ ํฉ
= F(n+2) - 1
(์ฆ๋ช )
(2) F1~Fn๊น์ง์ ํ์๋ฒ์งธ์ ํผ๋ณด๋์น ์์ ํฉ
= n์ด ํ์์ผ ๊ฒฝ์ฐ F(n+1), n์ด ์ง์์ผ ๊ฒฝ์ฐ F(n)
(์ฆ๋ช )
(3) F1~Fn๊น์ง์ ์ง์๋ฒ์งธ์ ํผ๋ณด๋์น ์์ ํฉ
= n์ด ์ง์์ผ ๊ฒฝ์ฐ F(n+1) - 1, n์ด ํ์์ผ ๊ฒฝ์ฐ F(n) - 1
(์ฆ๋ช )
(4) F1~Fn๊น์ง์ ๋ชจ๋ ํผ๋ณด๋์น ์์ ์ ๊ณฑ์ ํฉ
= F(n) x F(n+1)
(์ฆ๋ช )
Exercises
โ <BOJ B2 10870 ํผ๋ณด๋์น ์ 5> โ [โ Recursive Defintion ํ์ฉ]
: ์ต๋ 20๋ฒ์งธ์ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ . ์ ํ์ ์ธ ์ฌ๊ท ํธ์ถ์ ์ฌ์ฉํด O(2^n)์ผ๋ก ๊ตฌํ.
โ <BOJ B2 2747 ํผ๋ณด๋์น ์> โ [โก Memoization DP Technique ํ์ฉ]
: O(n)์ ํ์ฉํด memoization DP technique์ผ๋ก ์ต๋ 45๋ฒ์งธ์ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
โ <BOJ B1 2748 ํผ๋ณด๋์น ์ 2> โ [โก Memoization DP Technique ํ์ฉ]
: ์ 2747๋ฒ ๋ฌธ์ ์ ๋์ผ. ์ต๋ 90๋ฒ์งธ์ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
โ <BOJ B1 4150 ํผ๋ณด๋์น ์> โ [โก Memoization DP Technique ํ์ฉ]
: ์ 2747๊ณผ ๋๊ฐ์ด ๋์ผ. ๋ค๋ง, ํฐ ์ ์ฐ์ฐ ์ง์ํ๋ python์์ ์ ์๋๋ก ์ฝ๊ฒ ํ ์ ์๋ค.
โ <BOJ S5 10826 ํผ๋ณด๋์น ์ 4> โ [โก Memoization DP Technique ํ์ฉ]
: 2748๋ฒ ๋ฌธ์ ์ ๋์ผํ๊ฒ memoization DP technique ํ์ฉ. ์ต๋ 10,000๋ฒ์งธ์ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ , ํ์ด์ฌ์์๋ ํฐ ์์ ์ฐ์ฐ๋ ๋ชจ๋ ๊ฐ๋ฅํ๋, DP technique ์ฌ์ฉ ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ ์ํด ์์ ๋ ์์ ๊ณต๊ฐ๋ง ๋ฉ๋ชจ๋ฆฌ ๋ง๋ค๊ณ ํ์ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ํผ๋ณด๋์น ์ updateํ๋ ๋ฐฉ์์ผ๋ก ์งํ.
โ <BOJ S3 9711 ํผ๋ณด๋์น> โ [โก Memoization DP Technique ํ์ฉ]
: ์ญ์ ๋์ผํ๊ฒ O(n)์ผ๋ก DP technique ํ์ฉํ๋ฉด ๋์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ์ฃผ์ํด ๋ ๊ฐ์ ์๋ง ์ ์ธํด์ updateํ๋ ๋ฐฉ์์ผ๋ก dp-table update. modular operation property(addition) ํ์ฉํ๋ฉด ์ข ๋ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค.
โ <BOJ S4 15624 ํผ๋ณด๋์น ์ 7> โ [โก Memoization DP Technique ํ์ฉ]
: ์ญ์ ๋์ผํ๊ฒ O(n)์ผ๋ก ํ๋ฆผ. modular operation๊ณผ DP ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ์ํ ๋ ๊ฐ ๋ณ์๋ง ์ ์ธ ํ ํฌ๋ ํ์ฉ
โ <BOJ S4 9471 ํผ์ฌ๋ ธ ์ฃผ๊ธฐ> โ [โข Pisano Period]
: mod m์ด ์ฃผ์ด์ก์ ๋ brute-force๋ฅผ ํ์ฉํด ํผ์ฌ๋ ธ ์ฃผ๊ธฐ k(m)์ ๊ตฌํ๋ ๋ฌธ์ (mod m์ด (1,1)์ด ๋์ฌ ๋ ๋ฉ์ถฐ์ ์ฃผ๊ธฐ k(m) ๊ตฌํ๊ธฐ)
โ <BOJ G2 2749 ํผ๋ณด๋์น ์ 3> โ [โข Pisano Period์ ์ฑ์ง (7) ํ์ฉ]
: ์ต๋ 1000_000_000_000_000_00๋ฒ์งธ์ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ . ๋งค์ฐ ํฐ ์๊ฐ ๋์ฌ ์ ์์ผ๋ฏ๋ก 1_000_000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์ . ํผ์ฌ๋ ธ ์ฃผ๊ธฐ ์ฑ์ง, ๊ทธ๋ฆฌ๊ณ divisor๊ฐ 10^k์ด๋ผ๋ฉด Pisano Period pi(n) = 15 x 10^(k-1)์ ์ด์ฉํด์ ํธ๋ ๋ฌธ์ (์ ํฌ์คํ ๋ด์ฉ โข์ (7))
โ <BOJ G2 11444 ํผ๋ณด๋์น ์ 6> / <G2 7677 Fibonacci>โ [โฃ Power by Divide & Conquer Technique ํ์ฉ]
: ์ต๋ 1_000_000_000_000_000_000๋ฒ์งธ์ ํผ๋ณด๋์น ์ ํฐ ์๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์ . O(N)์ด ์๋ ํ๋ ฌ ๋ถํ ์ ๋ณต ๊ฑฐ๋ญ์ ๊ณฑ์ ํ์ฉํ O(logN)๋ง ํ์ฉ.
โ <BOJ G1 2086 ํผ๋ณด๋์น ์์ ํฉ> โ [โฃ Power by Divide & Conquer Technique + โค-(1) ํ์ฉ ]
: fibonacci sequence์ a๋ฒ์งธ ํญ๋ถํฐ b๋ฒ์งธ ํญ๊น์ง์ ํฉ์ ๊ตฌํ๋ ๋ฌธ์ . b๋ฒ์งธ ํญ๊น์ง์ ํฉ์์ (a-1)๋ฒ์งธ ํญ๊น์ง์ ํฉ์ ๋นผ๋ฉด ๋๋ค. b==a์ผ ๊ฒฝ์ฐ ๋จ์ํ F(b) ์ถ๋ ฅ. ์ด ๋ ํผ๋ณด๋์น ํฉ ๊ณต์ ์ โค-(1) ํ์ฉํด b๋ฒ์งธ ํญ๊น์ง์ ํฉ์ F(b+2)-1, (a-1)๋ฒ์งธ ํญ๊น์ง์ ํฉ์ F(a+1)-1 ์ฐ์ฐ. F(x)๋ฅผ ๊ตฌํ๋ ์๊ฐ๋ณต์ก๋๋ O(logn) ์ดํ์ power by divide & conquer ํ์ฉ
โ <BOJ G2 11442 ํ์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ> [โฃ Power by Divide & Conquer Technique + โค-(2) ํ์ฉ ]
: ์ โค-(2) ํ์ฉํด n์ด ํ์์ผ ๊ฒฝ์ฐ๋ F(n+1), ์ง์์ผ ๊ฒฝ์ฐ๋ F(n)์ O(logn)๋ง์ ์ถ๋ ฅ
โ <BOJ G2 11443 ์ง์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ> [โฃ Power by Divide & Conquer Technique + โค-(3) ํ์ฉ ]
: ์ โค-(3) ํ์ฉํด n์ด ํ์์ผ ๊ฒฝ์ฐ F(n)-1, ์ง์์ผ ๊ฒฝ์ฐ F(n+1)-1์ O(logn)๋ง์ ์ถ๋ ฅ(์ด ๋ -1์ด๋ฏ๋ก mod ๊ฒฐ๊ณผ ์์ ๋๋ ๊ฒฝ์ฐ ๊ณ ๋ ค)
โ <BOJ P5 11440 ํผ๋ณด๋์น ์์ ์ ๊ณฑ์ ํฉ> [โฃ Power by Divide & Conquer Technique + โค-(4) ํ์ฉ ]
: ์ โค-(4) ํ์ฉํด F(n) x F(n+1)์ ๊ฐ๊ฐ O(logn)๋ง์ ์ถ๋ ฅ
'Computer Science > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ข Topology Sort (3) | 2024.10.11 |
---|---|
๐ซ Prefix Sum (1) | 2024.09.06 |
๐ฒ Divide&Conquer (1) | 2024.06.08 |
๐ Power by Divide and Conquer (1) | 2024.06.06 |
๐ฃ๏ธ Shortest Path in an Unweighted Graph (0) | 2024.05.23 |
๋๊ธ