BOJ/๐Ÿฅ‡

โ˜…Divide & Conquer Upper-Advanced I - 7 Solvedโ˜…

metamong 2024. 7. 3.

โ˜… 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)๋งŒ์— ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.


 

 

 

๋Œ“๊ธ€