We will find a way, we always have.

-interstellar

Problem Solving/λ°±μ€€

[λ°±μ€€] 1629번: κ³±μ…ˆ - 파이썬

Redddy 2022. 5. 16. 21:49

πŸ“• 풀이 

A와 B와 Cκ°€ 곡백을 두고 μž…λ ₯λœλ‹€. μš°λ¦¬λŠ” (A^B)%C 값을 좜λ ₯ν•˜λ©΄ λœλ‹€. 단 A,B,C λŠ” λͺ¨λ‘ 2,147,483,647 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

수의 λ²”μœ„κ°€ λ°©λŒ€ν•˜λ‹€. λ•Œλ¬Έμ— 21μ–΅λ²ˆ κ³±ν•œλ‹€λ©΄ O(N)이여도 μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚  것이닀. 
κ·Έλž˜μ„œ λ‚˜λ¨Έμ§€ 뢄배법칙과 μ§€μˆ˜λ²•μΉ™μ„ μ‚¬μš©ν•˜μ—¬ 닡을 κ΅¬ν•˜μ˜€λ‹€.

 

πŸ“– μ§€μˆ˜λ²•μΉ™

(A^m)^n = (A^(m * n))

 

πŸ“– λ‚˜λ¨Έμ§€ λΆ„λ°° 법칙

(AxB) % C = (A%C) * (B%C) % C

 

μš°μ„  μ§€μˆ˜ 법칙을 μ‚¬μš©ν•˜μ—¬ λΆ„ν•  정볡을 ν•œλ‹€. 2 ^ 32 의 값을 κ³„μ‚°ν•˜λŠ” 방법은 2λ₯Ό 32번 κ³±ν•˜λŠ” 방법도 μžˆμ§€λ§Œ μ§€μˆ˜λ²•μΉ™μ„ μ‚¬μš©ν•˜μ—¬ (2^16)^2 16번 κ³±ν•œ 것을 μ œκ³±ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•˜λ©΄ 총 17번의 μ—°μ‚°μœΌλ‘œ 쀄일 수 μžˆλ‹€. 이 방법을 계속 μ‚¬μš©ν•˜λ©΄ 10번, μ—°μ‚° 7λ²ˆλ§Œμ— 결과에 도달할 수 μžˆλ‹€. 

 

λ§Œμ•½ Bκ°€ 1이라면 A 1μ œκ³±μ΄λΌλŠ” μ˜λ―Έμ΄κΈ°μ— λ°”λ‘œ κ·Έλƒ₯ A%Cλ₯Ό 리턴해쀀닀.

 

예제λ₯Ό 가지고 μ„€λͺ…ν•΄λ³΄μž

 

A : 10, B : 11, C : 12

 

μ˜ˆμ œλŠ” μš°μ„  Bκ°€ ν™€μˆ˜μ΄λ‹€. 

 

((A^5)*(A^5)*A)%C λ₯Ό μˆ˜ν–‰ν•΄μ€˜μ•Ό ν•œλ‹€.

ν•œλ²ˆ 더 μ§„ν–‰ν•˜λ©΄,,

(((A^2)*(A^2)*A)*((A^2)*(A^2)*A)*A)%C μ΄λ ‡κ²Œ λœλ‹€!

 

문자λ₯Ό λ‹€μ‹œ 숫자둜 λ°”κΏ”λ³΄μžλ©΄,,

 

(10^5)(10^5)*10 이 κ²½μš°λŠ” Bκ°€ ν™€μˆ˜μΌ κ²½μš°μ΄λ‹€. μ œκ³±κΌ΄μ— Aλ₯Ό ν•œλ²ˆ 더 κ³±ν•΄μ€€λ‹€.

 

B κ°€ 짝수라면 Aλ₯Ό ν•œλ²ˆ 더 곱해주지 μ•Šμ•„λ„ λœλ‹€.

 

 

πŸ’» μ½”λ“œ

def solve(a,b,c):
    if b == 1: # κ±°λ“­μ œκ³±μ„ ν•  ν•„μš”μ—†μŒ λ°”λ‘œ a의 λ‚˜λ¨Έμ§€ 리턴
        return a%c
    else:
        k = solve(a, b//2, c)
        if b%2 == 0: # bκ°€ 짝수라면 
            return (k*k)%c
        else: # bκ°€ ν™€μˆ˜λΌλ©΄
            return (k*k*a)%c
a,b,c = map(int, input().split())
print(solve(a,b,c))

 

πŸ“Ž 문제 링크 : κ³±μ…ˆ

 

1629번: κ³±μ…ˆ

첫째 쀄에 A, B, Cκ°€ 빈 칸을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. A, B, CλŠ” λͺ¨λ‘ 2,147,483,647 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

www.acmicpc.net

 

도움받은 κΈ€λ“€ : 개발 탄약고 , grace0st