BOJ/๐Ÿฅ‡

โ˜…Divide & Conquer Advanced I - 5 Solvedโ˜…

metamong 2024. 6. 15.

โ˜… 18291 ๋น„์š”๋œจ์˜ ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ โ˜…

import sys
input=sys.stdin.readline

def power_divide_conquer(a,b,c):
    if b==1:
        return a%c
    
    halved = power_divide_conquer(a,b//2,c)

    if b%2==0:
        return ((halved%c) * (halved%c)) %c
    else:
        return ((halved%c) * (halved%c) * (a%c))%c

BIG = 1000000007

for _ in range(int(input())):
    N=int(input())
    if N==1:
        print(1)
    elif N==2:
        print(1)
    else:
        print(power_divide_conquer(2,N-2,BIG)%BIG)

 

๐Ÿ“ฃ ์ง•๊ฒ€๋‹ค๋ฆฌ์˜ ๊ฐœ์ˆ˜๋ฅผ X๋ผ๊ณ  ํ•  ๋•Œ 1๋ฒˆ ๋‹ค๋ฆฌ๋ถ€ํ„ฐ X๋ฒˆ ๋‹ค๋ฆฌ๊นŒ์ง€ ๊ฑด๋„ˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. 

: P(n)์„ 1๋ฒˆ์—์„œ n๋ฒˆ ๋‹ค๋ฆฌ๊นŒ์ง€ ๊ฑด๋„Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, 1๋ฒˆ์—์„œ X๋ฒˆ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1๋ฒˆ์—์„œ 1๋ฒˆ๊นŒ์ง€ ๊ฑด๋„Œ ๋ชจ๋“  ๊ฒฝ์šฐ(1๋ฒˆ์—์„œ X๋ฒˆ๊นŒ์ง€ ํ•œ ๋ฒˆ์—) + 1๋ฒˆ์—์„œ 2๋ฒˆ๊นŒ์ง€ ๊ฑด๋„Œ ๋ชจ๋“  ๊ฒฝ์šฐ(2๋ฒˆ์—์„œ X๋ฒˆ๊นŒ์ง€ ํ•œ ๋ฒˆ์—) + .... 1๋ฒˆ์—์„œ (X-1)๋ฒˆ๊นŒ์ง€ ๊ฑด๋„Œ ๋ชจ๋“  ๊ฒฝ์šฐ(X-1๋ฒˆ์—์„œ X๋ฒˆ๊นŒ์ง€ ํ•œ ๋ฒˆ์—)์ด๋ฉฐ, P(n)์„ ์ด์šฉํ•ด์„œ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด P(X) = P(1) + P(2) + P(3) + ... P(X-1)์ด๋‹ค.

 

๐Ÿ“ฃ P(1) = 1, P(2) = 1 ์ด๋ฏ€๋กœ P(3) = P(2) + P(1) =1 + 1 = 2 / P(4) = P(3) + P(2) + P(1) = 2 + 1 + 1 = 4 / P(5) = 4 + 2 + 1 + 1 = 8  ....  / P(X) = 2 ^ (X-2)์ž„์„ ๊ทœ์น™์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 2^(X-2)๋ฅผ 1,000, 0007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ •๋‹ต

 

๐Ÿ“ฃ A^B์„ C๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€, B๊ฐ€ ๋งค์šฐ ํด ๊ฒฝ์šฐ(์œ„ ๋ฌธ์ œ ํ•œ์ • B<=10^9) ๋ถ„ํ• ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ์œผ๋กœ ๊ตฌํ•œ๋‹ค(๋ณ„๋„ ํฌ์ŠคํŒ… ์ฐธ์กฐ)


โ˜… 5904 Moo ๊ฒŒ์ž„ โ˜…

def dc(numbers,order,center_num):
    half_num = (numbers-center_num)//2
    if order<=half_num:
        dc(half_num,order,center_num-1)
    elif (half_num+1)<=order<=(half_num+center_num):
        if order == (half_num+1):
            print('m')
            return
        else:
            print('o')
            return
    else:
        dc(half_num,order-(half_num+center_num),center_num-1)

N=int(input())

#k
k=3
bf=0
cum=3
while cum<N:
    bf=cum
    cum*=2
    cum+=(k+1)
    k+=1

if (N-bf)<=k:
    if (N-bf) == 1:
        print('m')
    else:
        print('o')
else:
    numbers_in_a_cycle = cum-bf-k
    order = N-bf-k
    center_num = k-1
    dc(numbers_in_a_cycle,order,center_num)

 

๐Ÿ“ฃ m o ..... o๋ฅผ ํ•œ ๊ฐœ์˜ ๋ฌธ์ž์—ด๋กœ ๋ณด๊ณ  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์™ผ์ชฝ๋ถ€ํ„ฐ ๋‚˜์—ดํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

3 4 3 5 3 4 3 6 3 4 3 5 3 4 3 7 3 4 3 5 3 4 3 6 3 4 3 5 3 4 3 8 ...

 

์ด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์ž๋ฉด

โ‘  ์ž…๋ ฅ๋ฐ›์€ N์ด ์–ด๋Š ๊ทธ๋ฃน์— ์†ํ•˜๋Š” ์ง€ ๋จผ์ € ํŒ๋‹จ. ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ ๊ทธ๋ฃน์˜ ๊ทธ๋ฃน ๋‚ด์˜ ์ตœ๋Œ“๊ฐ’ k๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, k๋ฅผ ๊ตฌํ•œ๋‹ค. k๋ฅผ ๊ตฌํ•˜๊ณ  ๋‚˜๋ฉด k๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์„ ๋ถ„์„ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค (ex k = 7)

โ‘ก group ๋‚ด์— 2๊ฐ€์ง€ ์ผ€์ด์Šค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ,

(1) N๋ฒˆ์งธ ํ•ด๋‹น๋˜๋Š” ๋ฌธ์ž๊ฐ€ group ๋‚ด์— 1๋ฒˆ์งธ๋ถ€ํ„ฐ k๋ฒˆ์งธ ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

(2) N๋ฒˆ์งธ ํ•ด๋‹น๋˜๋Š” ๋ฌธ์ž๊ฐ€ group ๋‚ด์— (k+1)๋ฒˆ์งธ๋ถ€ํ„ฐ group ๋๊นŒ์ง€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

 

โ‘ข bf์™€ cum์„ ๋จผ์ € ๊ตฌํ•œ๋‹ค. bf๋Š” ์•ž group๊นŒ์ง€์˜ ๋ชจ๋“  ์ˆซ์ž ๊ฐœ์ˆ˜, cum์€ ํ˜„์žฌ ์†ํ•ด ์žˆ๋Š” group ๋๊นŒ์ง€์˜ ๋ชจ๋“  ์ˆซ์ž ๊ฐœ์ˆ˜.

(1) - 1: (N-bf) == 1์ผ ๊ฒฝ์šฐ, group ๋‚ด์˜ ๋งจ ์ฒซ๋ฒˆ์งธ ์ด๊ธฐ์— ๋ฐ”๋กœ 'm' ์ถœ๋ ฅ

(1) - 2:  ์œ„ (1)-1์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฐ”๋กœ 'o' ์ถœ๋ ฅ

 

โ‘ฃ ์œ„ (1)์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋ถ„ํ• ์ •๋ณต ๊ธฐ๋ฒ•์œผ๋กœ m์ธ์ง€ o์ธ์ง€ ์•Œ์•„๋‚ด๋ฉด ๋œ๋‹ค. group๋‚ด์— ์•ž์˜ k๊ฐœ์˜ ๊ธ€์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด center_num(k-1)์„ ๊ธฐ์ ์œผ๋กœ ์ขŒ์šฐ๊ฐ€ ๋™์ผ(๋ถ„ํ• ์ •๋ณต์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•Œ๋งž๋‹ค)ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ left + center_num + right์„ cycle์ด๋ผ ์ •์˜ํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐœ๋ฅผ ๊ตฌํ•จ

(1) numbers_in_a_cycle: cycle ๋‚ด์˜ ๊ฐœ์ˆ˜

(2) order: N๋ฒˆ์งธ ๊ธ€์ž๊ฐ€ cycle ๋‚ด์—์„œ ๋ช‡ ๋ฒˆ์งธ์— ํ•ด๋‹น๋˜๋Š” ์ง€

(3) center_num: cycle ๋‚ด์˜ ์ค‘์‹ฌ์ด ๋˜๋Š”, cycle๋‚ด์˜ ๊ฐ€์žฅ ํฐ ์ตœ๋Œ“๊ฐ’

 

โ‘ค ๊ทธ๋Ÿฌ๋ฉด โ‘ฃ์—์„œ ๊ตฌํ•œ (1), (2), (3)์„ ์ด์šฉํ•ด ๋ถ„ํ• ์ •๋ณต ์ง„ํ–‰

(1) order๊ฐ€ center_num๋ณด๋‹ค ์™ผ์ชฝ left part์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด, (์ฆ‰ ์œ„ ๊ทธ๋ฆผ ๊ธฐ์ค€ 3 4 3 left part์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด), left part๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ์ •๋ณต ์ง„ํ–‰

(2) order๊ฐ€ center_num์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด (์ฆ‰ ์œ„ ๊ทธ๋ฆผ ๊ธฐ์ค€ 5์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด), order๊ฐ€ half_num + 1์ผ ๊ฒฝ์šฐ 'm' ์ถœ๋ ฅ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 'o' ์ถœ๋ ฅ

(3) order๊ฐ€ center_num๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ right part์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด right part๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ์ •๋ณต ์ง„ํ–‰

 

: ์ฆ‰ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด center๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ ์œ„์น˜ํ•ด ์žˆ๋Š” ๋ถ€๋ถ„์— ๋”ฐ๋ผ ์ขŒ ๋˜๋Š” ์šฐ ๊ฐ๊ฐ์— ๋ถ„ํ•  ์ •๋ณต ์ง„ํ–‰. ๊ณ„์† divide ํ•ด๋‚˜๊ฐ€๋‹ค๊ฐ€ center_num part์— ์†ํ•  ๋•Œ m ๋˜๋Š” o (center_num part ๋งจ ์•ž์ด๋ฉด m, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด o) ์ถœ๋ ฅ


โ˜… 2447 ๋ณ„ ์ฐ๊ธฐ - 10 โ˜…

N=int(input())
ans=[['?']*N for _ in range(N)]

def star(N,x,y):
    global ans
    if N <= 1:
        return
    #(1) upper 
    for i in range(N//3):
        for j in range(N):
            ans[x+i][y+j] = '*'

    #(2) middle
    for i in range(N//3):
        for j in range(N):
            if 0<=j<N//3 or (N//3)*2<=j<N:
                ans[x+(N//3)+i][y+j] = '*'
            else:
                ans[x+(N//3)+i][y+j] = ' '

    #(3) below
    for i in range(N//3):
        for j in range(N):
            ans[x+(N//3)*2+i][y+j] = '*'

    star(N//3,x,y)
    star(N//3,x,y+N//3)
    star(N//3,x,y+(N//3)*2)
    star(N//3,x+N//3,y)
    star(N//3,x+N//3,y+(N//3)*2)
    star(N//3,x+(N//3)*2,y)
    star(N//3,x+(N//3)*2,y+N//3)
    star(N//3,x+(N//3)*2,y+(N//3)*2)

star(N,0,0)

for l in ans:
    print(*l,sep='')

 

๐Ÿ“ฃ ํฐ ํ‹€์˜ ๊ทœ์น™์„ ์ฐพ๊ณ , ๋ถ€๋ถ„๋ถ€๋ถ„ ๋‚˜๋ˆ„์–ด๊ฐ€๋ฉด์„œ(divide) ๋ฌด๋Šฌ๋ฅผ ๊ทœ์น™์ ์œผ๋กœ ๊ทธ๋ฆฌ๋Š”(conquer) ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰

 

โ‘  ๋จผ์ € ๋ชจ๋‘ ?๋กœ ๋งŒ๋“ค๊ณ  ๋‚œ ๋‹ค์Œ, size N x N ์ •์‚ฌ๊ฐํ˜•์—์„œ ์œ„ / ์ค‘๊ฐ„ / ์•„๋ž˜ ๊ฐ๊ฐ *๋‚˜ ๋นˆ ์นธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(ํŽ˜์ธํŠธ ์น ํ•˜๊ธฐ)

โ‘ก ๊ทธ ๋‹ค์Œ ๋‘๋ฒˆ์งธ ์ค„ ์ค‘๊ฐ„ ํŒŒํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ , ๋‚จ์€ 8๊ฐœ ํŒŒํŠธ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰(์žฌ๊ท€์ ) (์œ„ start(~) 8๊ฐœ ์ฝ”๋“œ)

: ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ „์ฒด ์‚ฌ๊ฐํ˜•์—์„œ 1, 2, 3 ์œ„์ชฝ์€ ๋ชจ๋‘ *, ์ค‘๊ฐ„์€ 4์™€ 6 *, ๊ทธ๋ฆฌ๊ณ  5๋งŒ ๋นˆ์นธ. 7, 8, 9๋Š” ๋ชจ๋‘ *. ์ดํ›„ ํŒŒํŠธ 5๋งŒ ์ œ์™ธํ•˜๊ณ  ๋‚จ์€ 8๊ฐœ์˜ ํŒŒํŠธ(๋ถ„ํ•  ๊ฒฐ๊ณผ) ๋ชจ๋‘ ๊ฐ๊ฐ ์žฌ๊ท€๋กœ ๋™์ผํ•˜๊ฒŒ ์ •๋ณต ์ง„ํ–‰. ๊ฒฐ๊ณผ size N์ด 1์ด ๋˜๋ฉด ์ข…๋ฃŒ.

 

๐Ÿ“ฃ size N์— ๋งž๊ฒŒ x,y ๊ฐ๊ฐ index๋งŒ ์ •ํ™•ํ•œ ๊ฐ’์œผ๋กœ ๋„ฃ์œผ๋ฉด ๋


โ˜… 15717 ๋–กํŒŒ์ด์–ด โ˜…

def get_power_by_divisor(a,b,c):
    if b == 1:
        return a%c
    else:
        x = get_power_by_divisor(a,b//2,c)
        if b%2 == 0:
            return ((x%c) * (x%c))%c
        else:
            return ((x%c) * (x%c) * (a%c))%c 

N = int(input())
if N == 0:
    print(1)
elif N == 1:
    print(1)
else:
    print(get_power_by_divisor(2,N-1,10**9+7))

 

๐Ÿ“ฃ <18291 ๋น„์š”๋œจ์˜ ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ> ๋ฌธ์ œ์™€ ์œ ์‚ฌ

 

๐Ÿ“ฃ N์—์„œ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ P(N)์ด๋ผ ํ•˜๋ฉด P(1) + P(2) + ... + P(N-1) + 1์ด๋‹ค. ์ฆ‰, 1์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ฐ๊ฐ์—์„œ N-1์„ ๋”ํ•œ๋‹ค๋ฉด N์ด ๋œ๋‹ค. 2๋ถ€ํ„ฐ N-1๊นŒ์ง€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€. ์ด ๋•Œ, N ์ž์ฒด์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ 1๊ฐ€์ง€ ๋” ๋”ํ•ด์ค€๋‹ค. P(1) = 1, P(2) = 2๋ฅผ ๋ฒ ์ด์Šค๋กœ P(N) = 2^(N-1)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋•Œ ์ง€์ˆ˜ N์ด ์ตœ๋Œ€ 10^12๋กœ ๋งค์šฐ ํฌ๋ฏ€๋กœ ๋ถ„ํ• ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ์„ ํ™œ์šฉํ•ด ๋‹ต์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.


โ˜… 29578 ะกัƒะผะผะฐ ัั‚ะตะฟะตะฝะตะน โ˜…

def pdq(a,b,c):
    if b <= 1:
        return a%c
    halved = pdq(a,b//2,c)
    if b%2==1:
        return ((halved%c) * (halved%c) * (a%c))%c
    else:
        return ((halved%c) * (halved%c) )%c

n = int(input())

num = 1
cnt = 0
while cnt < n:
    two = pdq(2,num,num)
    four = (two*two)%num
    three = pdq(3,num,num)
    six = (three*two)%num
    five = pdq(5,num,num)
    if (1+two+three+four+five+six)%num == 0:
        cnt+=1
        ans=num
    num+=1
print(ans)

 

๐Ÿ“ฃ 1 + 2^k + ... 6^k์ด k๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š” ์ง€ ์•Œ์•„๋ณด๋Š” ๋ฌธ์ œ. n๋ฒˆ์งธ ๋‚˜๋ˆ„์–ด์ง€๋Š” ์ˆ˜์ธ k๋ฅผ ์ถœ๋ ฅ. 2^k (mod k) ~ 6^k(mod k) ๊ฐ๊ฐ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋‚˜, 4^k(mod k)๋Š” 2^k(mod k) ๊ตฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณฑ, 6^k(mod k)๋Š” (2^k(mod k) * 3^k(mod k)) % k๋กœ ์กฐ๊ธˆ ๋” ๋นจ๋ฆฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋ฐ‘์ด 2, 3, 5์ธ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ๊ตฌํ•ด๋„ ok(๊ตฌํ•  ๋•Œ k ์ง€์ˆ˜๊ฐ€ ๋งค์šฐ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, (์‹ค์ œ n์ด ์ตœ๋Œ€ 65์ผ ๋•Œ ์ง€์ˆ˜ k๋Š” 44247์ด๋‹ค) ๋ถ„ํ•  ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ)


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€