โ 11442 ํ์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ โ


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]]
if n%2==1:
matrix = get_power(core,n,BIG)
print(matrix[0][0]%BIG)
else:
matrix = get_power(core,n-1,BIG)
print(matrix[0][0]%BIG)
๐ง F1๋ถํฐ Fn๊น์ง์ ํ์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ์ n์ด ํ์์ผ ๊ฒฝ์ฐ F(n+1), n์ด ์ง์์ผ ๊ฒฝ์ฐ F(n)์ผ๋ก ๊ตฌํ๋ฉด ๋๋ค. (ํผ๋ณด๋์น ํฌ์คํ ์ฆ๋ช ์ฐธ์กฐ) ์ด ๋ F ํผ๋ณด๋์น ๊ฐ์ ํ๋ ฌ์ ๋ถํ ์ ๋ณต ๊ฑฐ๋ญ์ ๊ณฑ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด O(logn)๋ง์ ๊ตฌํ๋ฉด ๋๋ค.
โ 11443 ์ง์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ โ


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]]
if n%2==0:
matrix = get_power(core,n,BIG)
else:
matrix = get_power(core,n-1,BIG)
ans=matrix[0][0]%BIG-1
print(ans if ans>=0 else ans+BIG)
๐ง n์ด ์ง์์ผ ๊ฒฝ์ฐ F1~Fn๊น์ง์ ์ง์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ์ F(n+1)-1, n์ด ํ์์ผ ๊ฒฝ์ฐ ์ง์๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ์ F(n)-1์ด๋ค. ์ด ๋ ์ ๋ฌธ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก F๋ ํ๋ ฌ์ ๋ถํ ์ ๋ณต์ ์ด์ฉํ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก O(logn)๋ง์ ๊ตฌํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ mod BIG ๊ฒฐ๊ณผ -1์ด ๋์ค๋ฉด BIG-1๋ก ๋ฐ๊พธ๊ธฐ
โ 7677 Fibonacci โ


BIG=10_000
def get_fibo_matrix(a,b,c,d,n):
if n == 1:
return [a%BIG,b%BIG,c%BIG,d%BIG]
else:
a1,b1,c1,d1=get_fibo_matrix(a%BIG,b%BIG,c%BIG,d%BIG,n//2)
a3 = ((a1%BIG)*(a1%BIG) + (b1%BIG)*(c1%BIG))%BIG
b3 = ((a1%BIG)*(b1%BIG) + (b1%BIG)*(d1%BIG))%BIG
c3 = ((c1%BIG)*(a1%BIG) + (d1%BIG)*(c1%BIG))%BIG
d3 = ((c1%BIG)*(b1%BIG) + (d1%BIG)*(d1%BIG))%BIG
if n%2==0:
return [a3,b3,c3,d3]
else:
a4 = ((a3%BIG)*(a%BIG) + (b3%BIG)*(c%BIG))%BIG
b4 = ((a3%BIG)*(b%BIG) + (b3%BIG)*(d%BIG))%BIG
c4 = ((c3%BIG)*(a%BIG) + (d3%BIG)*(c%BIG))%BIG
d4 = ((c3%BIG)*(b%BIG) + (d3%BIG)*(d%BIG))%BIG
return [a4,b4,c4,d4]
while 1:
n=int(input())
if n == 0:
print(0)
elif n == 1:
print(1)
elif n == -1:
break
else:
a,b,c,d=1,1,1,0
ans_list=get_fibo_matrix(a,b,c,d,n-1)
print(ans_list[0])
๐ง Fibonacci๋ฅผ ํ๋ ฌ์ ์ด์ฉํ ๋ถํ ์ ๋ณต ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก O(nlogn)๋ง์ ๊ตฌํ๋ฉด ๋๋ค.
โ 11444 ํผ๋ณด๋์น ์ 6 โ


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)
๐ง๋ง์ฐฌ๊ฐ์ง๋ก O(logn)๋ง์ Fibonacci ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
โ 2749 ํผ๋ณด๋์น ์ 3 โ


n = int(input())
M = 1_000_000 #M=10^k
k = 6
pi = 15 * (10**(k-1)) #pi(M) = 15*(10**(k-1))
if n == 1: print(1)
else:
fibo_arr=[0,1]
for x in range(2,n%pi+1):
fibo_arr.append((fibo_arr[-2]%M+fibo_arr[-1]%M)%M)
print(fibo_arr[-1])
๐งํผ์ฌ๋ ธ ์ฃผ๊ธฐ ์ฑ์ง์ ์ํด 10^n์ผ๋ก ๋๋ ๋๋จธ์ง๋ 15x(10^(n-1))์์ด ์๋ ค์ ธ ์๋ค. ์ด๋ฅผ ํ์ฉํด ํผ์ฌ๋ ธ ์ฃผ๊ธฐ pi๋ฅผ ๊ตฌํ๊ณ pi๊น์ง ๋๋ ค fibonacci ์๋ฅผ ๊ตฌํ ์ ์๋ค. / ๋ฌผ๋ก O(logn) ์ ํ์ ํ๋ ฌ ํ์ฉํ ๋ถํ ์ ๋ณต ๊ฑฐ๋ญ์ ๊ณฑ๋ ์ฌ์ฉ ๊ฐ๋ฅ
โ 2086 ํผ๋ณด๋์น ์์ ํฉ โ


a,b=map(int,input().split())
BIG = 1_000_000_000
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]]
if a == b:
matrix = get_power(core,a-1,BIG)
print(matrix[0][0]%BIG)
else: #sum(~b) - sum(~(a-1))
right_sum = (get_power(core,b+1,BIG)[0][0]-1)%BIG
left_sum = (get_power(core,a,BIG)[0][0]-1)%BIG
ans = right_sum - left_sum
print(ans%BIG if ans>=0 else (BIG+ans)%BIG)
๐ง a๋ฒ์งธ ํญ๋ถํฐ b๋ฒ์งธ ํญ๊น์ง์ ํผ๋ณด๋์น ์์ ๋ชจ๋ ํฉ์ b๋ฒ์งธ ํญ๊น์ง์ ํผ๋ณด๋์น ์์ ํฉ์์ (a-1)๋ฒ์งธ ํญ๊น์ง์ ํผ๋ณด๋์น ์์ ํฉ์ ๋นผ๋ฉด ๋๋ค. ๋บ ๊ฒฐ๊ณผ๊ฐ 0๋ณด๋ค ์๋ค๋ฉด ans์์ ๋นผ์ ๊ตฌํ๋ฉด ๋๋ค. ์ด ๋ n๋ฒ์งธ ํญ๊น์ง์ ํผ๋ณด๋์น ์์ ํฉ์ F(n+2)-1 ์ฌ์ฉ
โ 13075 Fibonacci Sequence โ

import sys
input=sys.stdin.readline
BIG = 1_000_000_000
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]]
for _ in range(int(input())):
n=int(input())
matrix = get_power(core,n-1,BIG)
print(matrix[0][0]%BIG)
๐ง ๋๊ฐ์ด 10^9์ผ๋ก ๋๋ Fibonacci ์ O(logn)๋ง์ ๊ตฌํ๋ฉด ๋๋ค.
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Topology Sort Advanced - 2 Solvedโ (0) | 2024.12.29 |
---|---|
โ Divide & Conquer Advanced I - 5 Solvedโ (0) | 2024.06.15 |
โ Math & Geometry Advanced I - 2 Solvedโ (0) | 2024.04.27 |
โ Implementation&Simluation Upper-Advanced I - 1 Solvedโ (0) | 2024.03.03 |
โ Stack & Queue & Deque Advanced I - 3 Solvedโ (0) | 2024.02.24 |
๋๊ธ